我正在装饰一个类以为其构造函数提供参数,当我尝试对此类进行子类化时出现问题:
@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 一起使用时,这是以下错误:"对象原型可能只是一个对象或空:未定义"
有没有办法既装饰父类又扩展子类?
尝试扩展通过.bind
创建的函数对您不起作用。绑定函数周围有大量的特殊逻辑。绑定函数没有.prototype
属性,这意味着扩展绑定函数意味着没有原型链可循。实现此装饰器的正确方法是
function decorate(foo, bar) {
return ctor => class extends ctor {
constructor(...args){
super(foo, bar, ...args);
}
};
}