JS组合/继承原型

时间:2018-05-31 13:02:10

标签: javascript object prototype object-composition

我希望能够扩展.extend(obj)函数中给出的任何对象。到目前为止,除了传入对象文字时,我才能使用它。

示例:

class myClass {
  static extend(obj) {
    Object.assign(Object.getPrototypeOf(obj), myClass.prototype);
    myClass.call(obj);
  }

  sayHello() {
    return 'hello!'
  }
}

当在构造函数中调用extend函数时,这样可以正常工作:

function foo() {
  myClass.extend(this);
}
const bar = new foo();
bar.sayHello();

但是,当我传入已经创建的对象文字时,myClass.prototype中的方法不可用。

const foo = {};
myClass.extend(foo);
foo.sayHello(); // this is not available.

有没有办法检查最后一个案例并将原型分配给对象本身而不是它的原型,以便最后一个场景也可以工作?

static extend() {
  if (/* obj is an object literal */) {
    Object.assign(obj, myClass.prototype);
  } else {
    // first example
}

1 个答案:

答案 0 :(得分:0)

  

当在构造函数中调用extend函数时,这样可以正常工作:

它不应该正常工作,当我运行它时,我收到错误Class constructor myClass cannot be invoked without 'new'。该错误是由于语句myClass.call(obj);。只有当我将类更改为ES5构造函数时,它才有效。

  

但是,当我传入已经创建的对象文字时,myClass.prototype中的方法不可用。

他们是给我的。

function myClass() {}

myClass.extend = function(obj) {
  Object.assign(Object.getPrototypeOf(obj), myClass.prototype);
  myClass.call(obj);
}

myClass.prototype.sayHello = function() {
  return 'hello!'
}

const foo = {};
myClass.extend(foo);
foo.sayHello(); // "hello!"