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 target
( target
是一个不可调用的对象),但你可以使用new target.constructor
(这是Object
)。
但是,这个东西还在不断变化。