我有一些TypeScript代码(有效地)看起来像这样:
class User {
name: string = "Bob";
sayHello(): void {
console.log("Hello, " + this.name);
}
}
class RegisteredUser extends User {
name: string = "Frank";
sayHello(): void {
var s = super;
setTimeout(() => s.sayHello(), 1000);
}
}
var registeredUser = new RegisteredUser();
registeredUser.sayHello();
问题在于,TypeScript(莫名其妙地,IMO)遵循关于"这个"的奇怪的JavaScript规则,而不是像世界上其他编程语言那样做。因此,当从 RegisterUser.sayHello() 中的覆盖调用 User.sayHello() 时,this
指向 User 类而不是实例化的 RegisterUser 对象,因此实际记录的内容是:
Hello, undefined
除了这样做对我来说没有任何意义这一事实(见 https://typescript.codeplex.com/workitem/477),解决此问题的最佳方法是什么,以便 User.sayHello() 中的this
在从回调调用时指向正确的对象?
好的,这有效:
setTimeout(() => s.sayHello.call(this), 1000);
这也有效,并且摆脱了对s
var 的需求:
sayHello(): void {
setTimeout(super.sayHello.bind(this), 1000);
}
如果你避开var s = super
作业,直接呼唤super.sayHello
,TS会为你插入那个魔法咒语。在 TS 游乐场尝试一下。