Dav*_*ver 5 javascript class decorator ecmascript-next
如何使用ES7类装饰器覆盖构造函数?
例如,我想要有类似的东西:
@injectAttributes({ foo: 42 })
class Bar {
constructor() {
console.log(this.foo);
}
}
Run Code Online (Sandbox Code Playgroud)
当injectAttributes它们被创建之前将装饰属性注入到新的实例:
> bar = new Bar();
42
> bar.foo
42
Run Code Online (Sandbox Code Playgroud)
显而易见的解决方案 - 使用不同的构造函数:
function overrideConstructor(cls, attrs) {
Object.assign(this, attrs);
cls.call(this);
}
Run Code Online (Sandbox Code Playgroud)
不起作用,因为创建的对象将是新构造函数的实例,而不是原始类型:
> bar = new overrideConstructor(Bar, {foo: 42})
42
> bar
[overrideConstructor {}]
> bar instanceof Bar
false
Run Code Online (Sandbox Code Playgroud)
BabelJS REPL 不支持装饰器,所以我正在使用该函数(并手动包装),但概念是相同的。
这是代码工作,以及下面的复制/粘贴:
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(new BareBar, { foo: 5 })
const thing = new Bar();
console.log(thing instanceof Bar);
Run Code Online (Sandbox Code Playgroud)
这打印:
5
true
Run Code Online (Sandbox Code Playgroud)
装饰器创建一个新的构造函数,在其中注入属性,然后复制原始原型以便instanceof工作。