子类化装饰 JavaScript Class

Subclassing a decorated JavaScript Class

我正在装饰一个 class 来为其构造函数提供参数,当我尝试子 class this class:

时出现问题
@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 一起使用时,会出现以下错误:“对象原型只能是对象或空值:未定义”

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

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

function decorate(foo, bar) {
  return ctor => class extends ctor {
    constructor(...args){
      super(foo, bar, ...args);
    }
  };
}