【发布时间】:2017-10-10 06:21:05
【问题描述】:
我正在使用 Typescript 装饰器,它们的行为似乎与我在与类继承一起使用时所期望的完全不同。
假设我有以下代码:
class A {
@f()
propA;
}
class B extends A {
@f()
propB;
}
class C extends A {
@f()
propC;
}
function f() {
return (target, key) => {
if (!target.test) target.test = [];
target.test.push(key);
};
}
let b = new B();
let c = new C();
console.log(b['test'], c['test']);
哪些输出:
[ 'propA', 'propB', 'propC' ] [ 'propA', 'propB', 'propC' ]
虽然我希望这样:
[ 'propA', 'propB' ] [ 'propA', 'propC' ]
所以,target.test 似乎在 A、B 和 C 之间共享。我对这里发生的事情的理解如下:
- 由于 B 扩展了 A,
new B()首先触发了 A 的实例化,这触发了对 A 的f的评估。由于target.test未定义,因此将其初始化。 -
f然后为 B 评估,因为它扩展了 A,所以首先实例化 A。所以,当时target.test(target是B)引用了为A定义的test。所以,我们将propB推入其中。至此,一切按预期进行。 - 与第 2 步相同,但对于 C。这一次,当 C 评估装饰器时,我希望它有一个新对象
test,不同于为 B 定义的对象。但日志证明我错了。
谁能向我解释为什么会发生这种情况 (1) 以及我将如何实现 f 以使 A 和 B 具有单独的 test 属性?
我猜你会称它为“特定于实例”的装饰器?
【问题讨论】:
标签: typescript inheritance decorator