Я написал следующий код Машинопись:Почему не машинопись не использует трюк «сам»?
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
Отказ от механизма прототипа сделает более неинтуитивный код. – Bergi
Почему бы вам не попробовать '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/). –