2010-07-26 6 views
4

모듈 패턴 다음에 구조화 된 Javascript 객체가 있습니다. 나는 다른 형제 "private"함수에서 호출되는 여러 private 함수를 가지고있다. 실수로 전역 변수/외부 변수/객체/함수에 액세스하지 않고 다른 변수/함수에 액세스하려면 어떻게합니까?포함 된 범위에있는 항목에 액세스하지 않고 Javascript 모듈 패턴에서 다른 형제 함수 및 변수에 안전하게 액세스하려면 어떻게해야합니까?

function doSomething() { 
    alert("Something I don't want to do"); 
} 

var My.Namespaced.SingletonClass = (function() { 
    var init = function() { 
    doSomething(); 
    } 

    var doSomething = function() { 
    alert("Something I want to do"); 
    } 

    return { 
    "init": init; 
    } 
})(); 

My.Namespaced.SingletonClass.init(); 

내 생각 엔 위의 코드가 올바른 내부 doSomething 기능 실제로 접속에,하지만 난 그것보다 좀 더 보안을하고 싶은 것입니다. 실수로 함수를 호출하거나 내 싱글 톤 주변의 객체를 처리 할 염려없이 명시 적으로 내부/중첩 된 함수를 처리 할 수 ​​있습니까?

답변

5

짧은 버전 : 할 수 없습니다. doSomething이 형제로 정의되지 않은 경우 init이면 JavaScript는 doSomething 함수를 찾거나 검색 범위를 벗어날 때까지 계속해서 더 넓은 범위를 검색합니다.

긴 버전 :

function doSomething() { 
    alert("Something I don't want to do"); 
} 

// Assuming My.Namespaced is already defined: 
My.Namespaced.SingletonClass = (function() { 
    var helpers = {}; 

    helpers.doSomething = function() { 
    alert("Something I want to do"); 
    } 

    var init = function() { 
    helpers.doSomething(); 
    } 

    return { 
    init: init 
    } 
})(); 

My.Namespaced.SingletonClass.init(); 

내가 도우미 기능이 진정 있다는 것이 중요 있는지 확실하지 않습니다 :이 같은 개인 도우미 기능을 유지하기 위해 개인 개체를 사용하여 행동의이 종류를 방지 할 수 있습니다 형제 (그러나 나는 그것이 특히 중요 할 것 인 이유를 보지 않는다).

또한 SingletonClass에 압정 전에 MyMy.Namespaced 정의 할 필요가 있다는 사실을 양지 - 당신이 반환있는 객체의 키에 대한 인용 JSON 스타일을 사용할 필요가 없습니다.

+0

저는 '헬퍼 (helpers)'개인 컨벤션을 좋아합니다 ... 고마워요! –

+2

... 변수가 아닌'NS'의 ** 속성 **을 정의하기 때문에'var NS.Singleton = {/*...*/};'을 할 수 없습니다. –

+1

@PierPaoloRamon 맞습니다. 바로 구문 오류입니다. 결정된. –