我寫了下面的打字稿代碼:爲什麼不打字使用'自我'的伎倆?
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」。但是,實際結果將是「夥計」和「未定義的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;
})();
如預期這將工作。 編譯代碼的具體方法的優點是什麼?打字稿是否決定留下那些不直觀的代碼?
這是由您決定的函數的調用者。 – elclanrs 2014-11-25 08:55:38
放棄原型機制會導致更直觀的代碼。 – Bergi 2014-11-25 08:59:26
你爲什麼不試試'run(person.die.bind(person))'?你如何期望TypeScript知道,當你鍵入'run(person.die)'時,它意味着被編譯爲'run(person.die.bind(die))'而不是'run(person.die)' ?請記住,[顯式總是比隱式更好](http://legacy.python.org/dev/peps/pep-0020/)。 – 2014-11-25 08:59:41