2014-01-20 4 views
4

나는 지금 자바 스크립트 "클래스"를 테스트하고 있습니다. 필자는 개인 기능의 "this"가 개체 자체를 가리키는 대신 전역 범위 (창)를 가리키고 있음을 확인했습니다.자바 스크립트 : 개인 기능을 호출 할 때 객체 컨텍스트가 손실되었습니다.

왜?

Info : 모드를 비공개로 유지하려는 경우 this.mode 대신 var 모드를 사용합니다. 내부 기능을 모두 비공개로 유지하여 사용자가 액세스 할 수 없도록하려고합니다. 기본적으로 .prototype을 사용하여 private 함수에 액세스하는 myStorage에 공용 함수를 추가합니다.

내 코드 :

var myStorage = function(mymode) { 
    var mode = mymode; 
    function privateFunctionA() { 
     // access this.mode to read mymode from constructor but 
     // this is pointing to window 
    }; 

    function privateFunctionB() { 
     // access this.mode to read mymode from constructor but 
     // this is pointing to window 
    }; 

    // check for indexeddb, websql and localstorage 
    if(mymode == 'A') { 
     privateFunctionA(); 
    } else { 
     privateFunctionB(); 
    } 
}; 
myStorage.prototype.publicFunc = function() { 
    console.log(this.mode); // does this work? 
} 

var data = new myStorage(); 
+0

['this] context (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/this)는 범위와 아무 관련이 없습니다. * 속성 *을 액세스 할 수있는 객체입니다. 그러나'mode'는 생성자에게 private 인 로컬 변수 *입니다. 그래서 NO - 프로토 타입 함수에서 액세스 할 수 없습니다. – Bergi

+0

'this'는 현재 실행중인 함수의 소유자 객체를 참조합니다. 엄밀히 말하면이 경우 프로토 타입 객체이고 myStorage는 아닙니다. – tiguchi

답변

6

this는 항상 (자바 스크립트 범위하지 기능입니다. 따라서, 개인의 기능에, this가 더 이상 부모 범위에서와 동일한 this을 의미합니다. 처리의 관용적 방법을

myStorage.prototype.publicFunc = function() { 
    console.log(this.mode); // does this work? 
} 
0 :. 자바 스크립트에서이이 조각에 관해서는, 부모 범위 예에서 self VAR에

var myStorage = function(mymode) { 
    var self = this; 
    var mode = mymode; 
    function privateFunctionA() { 
     console.log(self); 
    }; 
    ... 
}; 

this을 할당하는 것입니다

var 대신 생성자에서 modethis으로 다시 지정해야합니다. 그래서, 생성자는 이제 될 것입니다 :

var myStorage = function(mymode) { 
    var self = this; 
    this.mode = mymode; 
    function privateFunctionA() { 
     // works 
     console.log(self.mode); 
    }; 
    ... 
}; 

그리고 this.mode 또한이 경우에 .publicFunc()에서 작동합니다.

더 많은 문체 메모로 JavaScript의 생성자 함수는 보통 적절한 낙타 예 (즉, MyStorage)를 사용합니다.

+0

+1, 개인 함수 *가 로컬 * 변수 * ('mymode','var mode')에 접근 할 수 있음을 알고 싶을 수도 있습니다 – Bergi

+0

좋은데,이 모드 또는 var 모드를 유지할 방법이 없습니다 개인 그래서 개체 사용자가 그것을 볼 수 없어? – NovumCoder

+0

이상한, 내 공개 프로토 타입 함수에서 내 개인 함수를 어떻게 호출합니까? self.privateFunctionA 및 this.privateFunctionA가 작동하지 않습니다. – NovumCoder

0

범위의 변화와 당신이 기본 객체 자체에 대한 참조를 풀어 때문에, 프로토 타입을 사용하는 경우이 가진 개체 자체에 액세스 할 수 있습니다 것 같아요, 그래서 이것은 대신 윈도우가된다 . 이 도움이

Use of 'prototype' vs. 'this' in JavaScript?

희망 :

확인하기 위해이 다른 질문은 좀 더 많은 정보를 얻을 수 있습니다. 명시 적으로 call() 또는 apply()를 사용하여 컨텍스트를 전달하지 않는

+1

범위가 변경되지 않습니다. Context ('this')는 변경되지만,'data.publicFunc()'로 불리면 정확합니다. – Bergi