【发布时间】:2017-04-09 07:53:05
【问题描述】:
如何使用 ES7 类装饰器覆盖构造函数?
例如,我想要类似的东西:
@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);
}
不起作用,因为创建的对象将是新构造函数的实例,而不是原始类型:
> bar = new overrideConstructor(Bar, {foo: 42})
42
> bar
[overrideConstructor {}]
> bar instanceof Bar
false
【问题讨论】:
-
ES7 中没有装饰器。
-
“不起作用,因为创建的对象将是新构造函数的实例,而不是原始类型” 没有“原始类型”。
Bar是装饰的结果。或者更确切地说,因为 JavaScript 中没有装饰器。
标签: javascript class decorator ecmascript-next