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

5

我正在尝试使用JavaScript装饰器,但是在传递给装饰器函数的目标参数方面遇到了一些困难。

例如,如果你有:

@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;
    }
}

如您所见,两个目标(target)之间存在差异,我的问题是第二个目标出了什么问题。

我使用的是node v7.8.0,并且正在使用以下Babel插件(.babelrc):

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

}


1
装饰器目前不是 ECMAScript 标准的一部分,当前处于第二阶段。https://github.com/tc39/proposals - Stanislav Mayorov
1个回答

2

看起来你正在使用旧的遗留装饰器。请注意,自那时以来装饰器提案已经发展,API仍在不断演变。截至我撰写本文时,该提案处于第二阶段,即“草案”(有关详细信息,请参见此文档)。

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

但是需要再次强调:这些内容仍在不断变化。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接