我有一些(有效)看起来像这样的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)遵循关于“this”的奇怪的JavaScript规则,而不是像世界上其他所有编程语言那样做。因此,当从RegisteredUser.sayHello()中的覆盖调用User.sayHello()时,this
指向User 类而不是实例化的RegisteredUser 对象,以便实际记录的是:
Hello, undefined
除了这对我这样做没有任何意义这一事实(参见https://typescript.codeplex.com/workitem/477),解决这个问题的最佳方法是什么,以便在User.sayHello中this
()从回调调用时指向正确的对象?
答案 0 :(得分:2)
好的,这有效:
setTimeout(() => s.sayHello.call(this), 1000);
答案 1 :(得分:1)
这也有效,并且不需要s
var:
sayHello(): void {
setTimeout(super.sayHello.bind(this), 1000);
}
答案 2 :(得分:0)
如果您避免var s = super
分配,并直接致电super.sayHello
,TS会为您插入该魔法咒语。在TS游乐场试试。