JavaScript装饰器中的“target”是什么?

我正在玩JavaScript的装饰,但我很难与传递给装饰器function的目标

例如,如果你有

@Bar() class Foo { @deprecated(true) doMagic() {} } function Bar() { return function decorator(target) { } } function deprecated(state) { return function decorator(target, name, config) { return config; } } 

我希望这两个目标都是同一个东西,没错。 例如

 function Bar() { return function decorator(target) { let bar = new target(); // WORKS bar instanceof target; // -> true } } function deprecated(state) { return function decorator(target, name, config) { let bar = new target(); // ERROR let bar = new target.constructor() // WORKS bar instanceof target; // ‌TypeError: Right-hand side of 'instanceof' is not callable bar instanceof target.constructor // WORKS return config; } } 

正如你所看到的,两个目标之间是有区别的,而我的问题是第二个目标有什么问题

我使用节点v7.8.0,我使用后续的babel插件(.babelrc)

 { "presets": [ "es2015", "stage-0" ] 

}

这听起来像你使用旧的传统装饰。 请注意,从那时起装饰者的build议就已经开始了,而且API还在不断发展。 提案(正如我写的那样)在第二阶段,例如“草稿”(详见本文件 )。

使用旧版插件的@deprecated装饰器中的目标是最终将保存为Foo.prototype的对象。 而在@Bar ,它是Foo类的构造函数本身。 这就是为什么在你的@deprecated装饰,你不能使用new targettarget是一个不可调用的对象),但你可以使用new target.constructor (这是Object )。

但是,这个东西还在不断变化。

Interesting Posts