나는 다음과 같은 타이프 라이터 코드 작성 :타이프 스크립트가 '자기'트릭을 사용하지 않는 이유는 무엇입니까?
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"및 "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;
})();
. 코드를 컴파일하는 특정 방법의 장점은 무엇입니까? 타이프 크립트는 직관적이지 않은 코드 조각을 남겨두기로 결정 했습니까?
var Person = (function() {
function Person(firstName, lastName) {
var _this = this;
this.firstName = firstName;
this.lastName = lastName;
this.die = function() {
_this.lastName += "dead";
};
}
return Person;
})();
중요한 부분은 당신이 다이를 배치해야한다는 것입니다 :
class Person {
constructor(public firstName: String, public lastName: String) {
}
die =() => {
this.lastName += "dead"
}
}
가되다 :
이것은 함수의 호출자에게 달려 있습니다. – elclanrs
프로토 타입 메커니즘을 포기하면보다 직관적 인 코드가 작성됩니다. – Bergi
'run (person.die.bind (person))'을 사용해 보시지 않겠습니까? TypeScript가'run (person.die)'를 타이핑 할 때,'run (person.die)'가 아닌'run (person.die.bind (die))'에 컴파일되도록 의도 된 것을 어떻게 알 수 있을까요? ? 기억하세요, [명백한 것은 항상 내포적인 것보다 낫습니다] (http://legacy.python.org/dev/peps/pep-0020/). –