2011-10-10 5 views
7

JavaScript에서 프로토 타입 상속을 사용하여 수년간 응용 프로그램을 작성한 후 기생적인 상속을 사용하여 탐색을 시작했습니다. 객체 계층 구조를 생성 할 때 잠재적으로 메모리에 메소드 사본을 여러 개 만들 수 있다는 기본적인 함정에도 불구하고, 나는 단순함과 "새로운"것이 불필요하게된다는 사실로 인해 내게 정말 공감한다는 것을 알게되었습니다. 그러나, 나는 "이것으로 일어나는 일에 붙어 있습니다.""this"는 JavaScript 기생 상속에서 무엇을 말합니까?

function foo() { 
     return { 
      method1 : function() {...} 
     } 
    } 

    function bar() { 
     var that = foo(); 
     that.method2 = function() { 
      //is "this" pointing to bar()? 
     } 
     return that; 
    } 

내가 바() 객체의 의견에 질문으로, "이"바 참조 않습니다 (: 나는 온라인으로 본 적이 대부분의 예는 다음처럼 기생 상속을 구현하는 방법을 보여주는 표면에 흠집) 또는 method2로 강등 범위가 무엇입니까?

감사합니다.

답변

3

빠른 테스트 thisbar에 의해 반환 된 객체에 제대로 의미 있음을 나타냅니다 : 당신의 method2()foo() 의사 생성자 함수에서 반환됩니다 개체에 바인딩됩니다에

function foo() { 
    return { 
     method1 : function() { return "spam" } 
    } 
} 

function bar() { 
    var that = foo(); 
    that.method2 = function() { 
     return this.method1(); 
    } 
    return that; 
} 

var b = bar(); 
b.method2(); // "spam" 
+0

니스. 감사! 이제 앞으로 나아갈 수 있습니다. 오랫동안 프로토 타입 상속을 해낸 개념적 도약입니다. 기생 상속은 친숙하지만 아직 조금 불편한 곳에서는 충분히 다르지만 좋은 일입니다! :) –

1

this context variable. 모든 함수 (문맥)는 문맥 변수의 값인 바운드 된 this을 가지며, 메소드 자체로부터의 호출에 의존한다.

예를 들어 개체에서 속성을 호출하면 (예 : 거기에서 수행 한 것처럼) this variable이 해당 개체로 정확하게 설정됩니다. 함수를 바로 호출하면 해당 this은 ES3의 global object에 바인딩되고 ES5의 null에 바인딩됩니다.

this에서 값을 변경할 수있는 다른 방법과 키워드가 있습니다. new, .bind(), .call().apply()과 같이 하지만 여기에서도 특정 스 니펫에서 thisthat에 저장된 객체에 바인딩됩니다.

+0

생각 해보세요.하지만 ES3 및 ES5는 무엇입니까? – CapelliC

관련 문제