2

我正在装饰一个类以为其构造函数提供参数,当我尝试对此类进行子类化时出现问题:

@decorate('foo', 'bar')
class Foo {
    constructor(foo, bar) {}
}

class Bar extends Foo {}


function decorate(foo, bar) {
    return function(ctor) {
        return ctor.bind(null, foo, bar);
    };
}

由于上下文传递给构造函数,上述方法不起作用null(至少我认为这是问题的根源)。与 Babel 一起使用时,出现以下错误:“对象原型可能只是一个对象或 null:未定义”

有没有办法既装饰父类又扩展子类?

4

1 回答 1

1

尝试扩展通过创建的函数.bind对您不起作用。绑定函数有大量的特殊逻辑。绑定函数没有.prototype属性,这意味着扩展绑定函数意味着没有原型链可以遵循。实现这个装饰器的正确方法是

function decorate(foo, bar) {
  return ctor => class extends ctor {
    constructor(...args){
      super(foo, bar, ...args);
    }
  };
}
于 2016-02-03T18:18:21.140 回答