2013-06-14 2 views
0

상속 될 수 있고 일부 공용 속성이있는 캡슐화 된 개체를 만들려고합니다.모듈 패턴 및 범위

var MyObject = (function() 
{ 
    function myObject() 
    { 
     //Public variables 
     this.publicVar1 = 'hello'; 
     this.publicVar2 = 'world'; 
    } 

    function foo() 
    { 
     console.log(this.publicVar1 + ' ' + this.publicVar2); 
    } 

    function bar() 
    { 
     foo(); 
    } 

    //Public API 
    myObject.prototype = { 
     constructor: myObject, 
     foo: foo, 
     bar: bar 
    } 

    return myObject; 

})(); 

var mo = new MyObject(); 
mo.foo(); //hello world 
mo.bar(); //undefined undefined 

내 질문은 왜 정확히 mo.bar()가 '정의되지 않은 정의되지 않은'로그 않고 내가이 문제를 해결하는 방법 : 여기에 몇 가지 코드는?

publicVar1 및 publicVar2를 내부적으로 MyObject 모듈에 유지하려고하지만 myObject 프로토 타입을 확장하는 다른 모든 객체에 공개적으로 액세스하고 상속 할 수도 있습니다.

감사합니다.

답변

0

bar는 foo()를 호출 할 때 어떤 객체의 멤버도 아닌 함수를 호출하고 해당 함수의 "this"키워드가 window 객체를 참조합니다.

이 작동합니다 :

function bar() 
{ 
    this.foo(); 
} 

편집

귀하의 코드 범위를 이해하려고 사람을 오해 아주 쉽게 할 수 있습니다. mo.foo() 및 mo.bar() 및 this.foo() (bar 함수 내부)를 호출 할 때 함수의 이름이 아니라 프로토 타입에 대해 선언 한 속성을 참조한다는 점에 유의하십시오 모듈 내부에서 선언했습니다. 그들이 우연히 같은 이름이 된 것은 우연의 일치입니다.

아래의 코드는 조금 더 그것을 설명합니다 : 이것은 확실히, 덕분에 문제를 해결

var MyObject = (function() 
{ 
    function myObject() 
    { 
     //Public variables 
     this.publicVar1 = 'hello'; 
     this.publicVar2 = 'world'; 
    } 

    function moduleFooFunction() 
    { 
     console.log(this.publicVar1 + ' ' + this.publicVar2); 
    } 

    function moduleBarFunction() 
    { 
     this.foo(); 
    } 

    //Public API 
    myObject.prototype = { 
     constructor: myObject, 
     foo: moduleFooFunction, 
     bar: moduleBarFunction 
    } 

    return myObject; 

})(); 

var mo = new MyObject(); 
mo.foo(); //hello world 
mo.bar(); //undefined undefined 
+0

. 나는 아직도 불분명하다. 당신은 전혀 정교 할 수 있습니까? this.foo()를 호출하면 프로토 타입에서 함수를 호출하고 publicVar1과 publicVar2가 해당 프로토 타입의 객체의 멤버이므로 올바른 범위에 있습니까? 다시 한번 감사드립니다. – adampetrie

+0

@adampetrie 프로토 타입은 모든 인스턴스에 의해 상속되며 인스턴스의 일부인 것처럼 처리됩니다 (인스턴스에서 설정 한 경우 덮어 쓰지 않고 섀도 잉 됨). 'mo.prototype'는'foo'를 가지고 있습니까? 예 .' mo.prototype'의'foo'를'mo '. " 따라서이 호출 중에'foo' 내부에서'this '는'mo'를 의미하므로'this.bar()'를 실행하는 것은'mo.bar()'와 같다. –