我编写了以下TypeScript代码:
class Person {
constructor(public firstname: string, public lastname:string){
}
public die(){
this.lastname += " RIP";
}
这编译为:
var Person = (function() {
function Person(firstname, lastname) {
this.firstname = firstname;
this.lastname = lastname;
}
Person.prototype.die = function () {
this.lastname += " RIP";
};
return Person;
})();
当然这是一种有效的方法,但在以下情况下它不会按预期工作:
function run(delegate){
delegate();
}
var person = new Person("guy", "dude");
run(person.die);
alert(person.lastname);
alert(lastname);
此处的预期警报将是" dude RIP",然后" undefined"。但是,实际结果将是" dude"和"未定义的RIP"。这是因为这个参数在JS中很奇怪。
一个常见的解决方案是通过闭包使用自变量,并放弃原型机制,即
var Person = (function() {
function Person(firstname, lastname) {
var self = this;
self.firstname = firstname;
self.lastname = lastname;
self.die = function() {
self.lastname += " RIP";
}
}
return Person;
})();
哪个会按预期工作。 这种特定方式编译代码的优点是什么?打字稿是否决定留下那条不直观的代码?
答案 0 :(得分:7)
您需要稍微更改代码的结构,以使其使用_this = this
模式:
class Person {
constructor(public firstName: String, public lastName: String) {
}
die = () => {
this.lastName += "dead"
}
}
变为:
var Person = (function () {
function Person(firstName, lastName) {
var _this = this;
this.firstName = firstName;
this.lastName = lastName;
this.die = function () {
_this.lastName += "dead";
};
}
return Person;
})();
关键部分是你需要将die函数放在对象而不是原型上,这迫使它使用_this = this
。
答案 1 :(得分:3)
如果要捕获它,则应使用箭头函数语法。我认为最好在委托创建而不是类创建时使用它。
唯一需要改变的是:
run(()=>person.die());
这使您可以捕获任何函数,无论它是如何定义的。