2014-11-25 2 views
3

나는 다음과 같은 타이프 라이터 코드 작성 :타이프 스크립트가 '자기'트릭을 사용하지 않는 이유는 무엇입니까?

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" 
    } 
} 

가되다 :

+2

이것은 함수의 호출자에게 달려 있습니다. – elclanrs

+0

프로토 타입 메커니즘을 포기하면보다 직관적 인 코드가 작성됩니다. – Bergi

+0

'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/). –

답변

7

당신은 약간은 _this = this 패턴을 사용하여 얻을 수 있도록 코드의 구조를 변경해야 함수는 프로토 타입이 아닌 객체에 대해 작동하므로 _this = this을 사용해야합니다.

+5

이 방법을 사용하면 언제이 패턴을 사용할지 결정할 수 있습니다. 감사! 또한이 방법을 사용하는 것이 프로토 타입을 사용하는 것이 더 나은 이유를 발견했습니다. 이러한 방식으로 모든 객체에는 함수의 복사본이있어 더 큰 메모리 풋 프린트가 발생합니다. 프로토 타입을 사용하면 모든 객체가 더 얇아집니다. 감사! – Gilthans

3

캡쳐 할 때 화살표 함수 구문을 사용해야합니다. 클래스 작성 대신 델리게이트 생성이라는 관점에서 이것을 사용하는 것이 더 좋을 것이라고 생각합니다. 될 필요

유일한 변화는 :

run(()=>person.die()); 

이는 관계없이 정의 된 방법의 기능이를 캡처 할 수 있습니다.

+0

이것은 더 많은 해킹 인 허용 된 대답보다 나은 방법입니다. –

관련 문제