javascript 装饰器中的“目标”是什么

Jea*_*eri 5 javascript decorator node.js ecmascript-6 babeljs

我正在使用 javascript 装饰器,但我很难处理传递给装饰器函数的目标

例如,如果你有

@Bar()
class Foo {
    @deprecated(true)
    doMagic() {}
}

function Bar() {
    return function decorator(target) {

    }
}

function deprecated(state) {
    return function decorator(target, name, config) {
         return config;
    }
}
Run Code Online (Sandbox Code Playgroud)

我希望两个target是一回事,对,不是。例如

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

如您所见,两个target之间存在差异,我的问题是第二个target有什么问题

我使用 node v7.8.0,我正在使用以下 babel 插件 (.babelrc)

{
    "presets": [
        "es2015",
       "stage-0"
   ]
Run Code Online (Sandbox Code Playgroud)

}

T.J*_*der 2

听起来您正在使用旧的遗留装饰器。请注意,装饰器提案自那时以来一直在发展,并且 API 仍在不断发展。该提案(正如我撰写本文时)处于第二阶段,例如“草案”(有关详细信息,请参阅本文档)。

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

但再次强调:这个东西仍然在变化。