【发布时间】:2018-03-08 23:05:49
【问题描述】:
假设我有一个Base 类和一个从Base 扩展的Test 类。 Base 类有一个受保护的成员,假设它是一个存储字符串字典的对象。我希望在Test 类中覆盖该字典,但不知何故,它无法按预期工作(至少在我的生产代码中,以及当我在JS Bin 上测试它时):
type ConstantsDict = { [key: string]: string }
abstract class Base {
protected readonly _constants: ConstantsDict = {
FOO: 'bar'
}
protected get _magicStringFoo(): string {
return `Base: ${this._constants.FOO}`;
}
constructor() {
// The magic constant FOO is incorrect when invoked in Test
alert(this._magicStringFoo);
}
}
class Test extends Base {
// Overwrite inherited member
protected readonly _constants = {
FOO: 'lorem ipsum dolor sit amet'
}
// Overwrite inherited getter
protected get _magicStringFoo(): string {
return `Test: ${this._constants.FOO}`;
}
// Let's give Test it's own getter for the same magic constant
private get _magicStringFooPrivate(): string {
return `Test: ${this._constants.FOO}`;
}
constructor() {
super();
// The magic constant FOO is correct over here
alert(`Local magic constant FOO is: ${this._magicStringFooPrivate}`)
}
}
new Test();
代码将提醒Test: bar 而不是Test: lorem ipsum dolor sit amet。好消息是,从 Base 类继承的受保护 getter 正在被 Test 覆盖,但不知何故,this 引用仍然指向不正确的类。
【问题讨论】:
-
你已经合并了原型继承。当这段代码被转译成 javascript 时,原型链的构造就好像它是用 JavaScript 编写的一样。尽管这看起来与 Java 或 C# 相似,但底层语言并不是这样工作的。请调查原型继承。
标签: typescript