2012-07-04 6 views
3

나는 자바 스크립트 안돼서, 나는 네임 스페이스 지정을 위해 다음과 같은 계획을 마련했습니다Javascript 네임 스페이스 -이 특별한 방법은 우수 사례입니까?

(function() { 
    var ns = Company.namespace("Company.Site.Module"); 

    ns.MyClass = function() { .... }; 

    ns.MyClass.prototype.coolFunction = function() { ... }; 

})(); 

Company.namespace 단순히 모듈까지 개체의 체인을 생성하는 스크립트를 사용하여 등록하는 기능입니다. 비 전역 범위에서

외부 :

var my = new Company.Site.Module.MyClass(); 

나는 특히 내가 전역에서 변수 ns을 숨길 수있는 방법에 대해 부탁 해요 - 즉시 실행되는 포장 익명 함수에 의해. 나는 도처에 Company.Site.Module를 쓸 수 있었지만 DRY가 아니었고 지역 변수에 ns를 저장하는 것과 비교하면 조금 지저분했다.

당신의 의견은 무엇입니까? 이 접근법에는 어떤 함정이 있습니까? 표준으로 여겨지는 다른 방법이 있습니까?

+0

을 할 수있는 범위를 전역 변수에 필요한 경우

에 대한 리터럴 객체를 사용 있습니다 @ pimvdb 멋진 아이디어,하지만 그것은 여러 가지로 이상하게 보일 것입니다 클래스 및 메서드에 대한 확장 ... – Max

답변

1

클래스 범위를 지정하지 않아도됩니다. 클래스 외부에 전역 변수가있는 경우에만 필요합니다. 나는이 방법을 사용 ...

MyApp.MyClass = function() { 
}; 

MyApp.MyClass.prototype = { 
    foo: function() { 
    } 
}; 

또한 내가 청소기 프로토 타입 선언 그러나 당신이 당신이

(function() { 
    var scopedGlobalVariable = "some value"; 

    MyApp.MyClass = function() { 
    }; 
    MyApp.MyClass.prototype = function() { 
     foo: function() { 
     } 
    }; 
})(); 
1

당신의 접근 방식은 나에게 잘 들립니다.

그러나, 당신은 또한 자동 실행 기능에서 "클래스"를 반환하여 약간 다른이를 수행 할 수 있습니다

Company.Site.Module.MyClass = (function() { 
    var MyClass = function() { ... }; 
    MyClass.prototype.foo = function() { ... }; 
    return MyClass; 
})(); 

이 적어도 모든 ns. 접두사를 제거합니다. 네임 스페이스 함수는 여전히 개체를 만드는 데 사용할 수 있지만 자체 실행 기능은 아닙니다.

+0

고마워! 문제는 모든 네임 스페이스에서 몇 가지 클래스와 몇 가지 자유 함수를 사용할 수 있다는 것입니다. 그러나 TheClass를 클래스 변수로 사용하여 클래스를 만들고, 클래스 선언 내부에서 ns를 제거한 다음, 그러나 여전히 외부에 ns를 가지고있다. 아니면이게 너무 많다고 생각하니? – Max

+0

나에게 매우 합리적인 소리! – Niko

+0

지금은 Upvoting하지만 다른 사람들이 허용 된 것으로 확인하기 전에 다른 사람이 대답 할 수 있도록 하루를 기다리는 것은 사용자 정의라고 생각합니다.) – Max

관련 문제