首页 > 解决方案 > JS组合/继承原型

问题描述

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

例子:

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

  sayHello() {
    return 'hello!'
  }
}

当从构造函数中调用扩展函数时,这很好用,如下所示:

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
}

标签: javascriptobjectprototypeobject-composition

解决方案


当从构造函数中调用扩展函数时,这很好用,如下所示:

它不应该正常工作,当我运行它时,我得到了错误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!"

推荐阅读