子类化一个修饰的 JavaScript 类



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

@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);
    }
  };
}

最新更新