首页 > 解决方案 > 用另一个类属性/方法扩充所有对象

问题描述

想象一下我有两节课

class Point {
}

class EditablePoint extends Point {
  // list of additional properties and methods
}

function edit(editablePoint) {
  //
}

let point = new Point();
edit(point);

如何使用另一个类方法/属性来扩充所有对象?

任何prototype黑客都对我不起作用。似乎我无法解决这个问题,而不是重新创建对象或手动分配类的附加属性或使用循环。我想要一些单行清洁解决方案。

免责声明:这看起来像一个我同意的反模式,但是我有大量的Points 数组,只有在非常罕见的情况下我才需要编辑它们,并且我想在不引入任何复制的情况下就地编辑它们,因为数组很大。

为什么我不喜欢让所有点都具有可编辑属性并希望将它们放在原型上:

标签: javascriptecmascript-6es6-class

解决方案


您可以通过将prototype of 设置为prototype ofObject.assign来添加属性和setPrototypeOf添加方法,但是由于从您那里继承仍然会有方法。EditablePointPointEditablePointPointPoint

class Point {
  constructor() {
    this.point = true;
  }
  foo() {
    console.log('foo')
  }
}

class EditablePoint extends Point {
  constructor() {
    super();
    this.editable = true;
  }
  bar() {
    console.log('bar')
  }
}

function edit(editablePoint) {
  Object.assign(editablePoint, new EditablePoint);
  Object.setPrototypeOf(editablePoint, EditablePoint.prototype)
}

let point = new Point();
edit(point);

console.log(point)
point.foo();
point.bar();


推荐阅读