用类装饰器覆盖构造函数?

时间:2016-11-25 00:17:51

标签: javascript class decorator ecmascript-next

如何使用ES7类装饰器覆盖构造函数?

例如,我希望有类似的内容:

<PropertyGroup>
  <TypeScriptCompileBlocked>True</TypeScriptCompileBlocked>
</PropertyGroup>

@injectAttributes({ foo: 42 }) class Bar { constructor() { console.log(this.foo); } } 装饰器在创建新实例之前会将属性注入其中:

injectAttributes

显而易见的解决方案 - 使用不同的构造函数:

> bar = new Bar();
42
> bar.foo
42

不起作用,因为创建的对象将是新构造函数的实例,而不是原始类型:

 function overrideConstructor(cls, attrs) {
   Object.assign(this, attrs);
   cls.call(this);
 }

1 个答案:

答案 0 :(得分:3)

BabelJS REPL不支持装饰器所以我正在使用该功能(并手动换行),但概念是相同的。

Here代码正常工作,下面是复制/粘贴:

function injectAttributes(cls, attrs) {
  const injected = function(...args) {
    Object.assign(this, attrs);
    return cls.apply(this, args);
  }
  injected.prototype = cls.prototype;
  return injected;
}


class BareBar {
  constructor() {
    console.log(this.foo);
  }
}
const Bar = injectAttributes(BareBar, { foo: 5 })

const thing = new Bar();
console.log(thing instanceof Bar);

打印:

5
true

装饰器创建一个新的构造函数,其中注入属性,然后复制原始原型,以便instanceof起作用。