对装饰的JavaScript类进行子类化

时间:2016-02-03 17:58:23

标签: javascript babeljs ecmascript-7

我正在装饰一个类来为它的构造函数提供参数,当我尝试子类化这个类时会出现问题:

@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一起使用时,会出现以下错误:"对象原型可能只是一个Object或null:undefined"

有没有办法同时装饰父类并扩展子类?

1 个答案:

答案 0 :(得分:1)

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

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