내 개체와 함수가 이름이 같은 다른 개체와 함수에 의해 덮어쓰이지 않도록 JavaScript에서 네임스페이스를 만들려면 어떻게 해야 합니까?다음을 사용했습니다.
if (Foo == null
typeof(Foo) != "object") { var Foo = new Object();}
좀 더 우아하거나 간결한 방법이 있을까요?
질문에 대한 답변
Enterprise jQuery 사이트에서 찾을 수 있는 접근 방식을 사용합니다.
다음은 개인 및 공공 재산과 기능을 선언하는 예를 제시하겠습니다.모든 것은 스스로 실행하는 익명 기능으로 수행됩니다.
(function( skillet, $, undefined ) {
//Private Property
var isHot = true;
//Public Property
skillet.ingredient = "Bacon Strips";
//Public Method
skillet.fry = function() {
var oliveOil;
addItem( "tn Butter nt" );
addItem( oliveOil );
console.log( "Frying " + skillet.ingredient );
};
//Private Method
function addItem( item ) {
if ( item !== undefined ) {
console.log( "Adding " + $.trim(item) );
}
} }( window.skillet = window.skillet
{}, jQuery ));
공개 멤버 중 한 명에게 접근하려면skillet.fry()
또는skillet.ingredients
.
정말 멋진 점은 동일한 구문을 사용하여 네임스페이스를 확장할 수 있다는 것입니다.
//Adding new Functionality to the skillet (function( skillet, $, undefined ) {
//Private Property
var amountOfGrease = "1 Cup";
//Public Method
skillet.toString = function() {
console.log( skillet.quantity + " " +
skillet.ingredient + " & " +
amountOfGrease + " of Grease" );
console.log( isHot ? "Hot" : "Cold" );
}; }( window.skillet = window.skillet
{}, jQuery ));
세 번째undefined
논쟁
세 번째는
undefined
인수는 값 변수의 소스입니다.undefined
현재도 관련이 있는지는 모르겠지만, 이전 브라우저/자바스크립트 규격(ecmascript 5, javascript < 1.8.5 ~fox 4)을 사용하는 동안 글로벌 범위 변수입니다.undefined
쓰기 가능하기 때문에 누구나 값을 다시 쓸 수 있습니다.세 번째 인수(값이 전달되지 않은 경우)는 다음과 같은 이름의 변수를 만듭니다.undefined
네임스페이스/함수로 범위가 지정됩니다.네임스페이스를 작성할 때 값이 전달되지 않았기 때문에 기본값입니다.undefined
.
마음에 들어요.
var yourNamespace = {
foo: function() {
},
bar: function() {
} };
...
yourNamespace.foo();
오브젝트 리터럴 형식보다 조금 덜 제한적이라고 생각되는 또 다른 방법은 다음과 같습니다.
var ns = new function() {
var internalFunction = function() {
};
this.publicFunction = function() {
}; };
위의 내용은 모듈 패턴과 거의 비슷하며, 좋든 싫든 간에 객체 리터럴의 견고한 구조를 피하면서 모든 기능을 공개합니다.
좀 더 우아하거나 간결한 방법이 있을까요?
예. 예:
var your_namespace = your_namespace
{};
그럼 넌 가질 수 있다.
var your_namespace = your_namespace
{}; your_namespace.Foo = {toAlert:'test'}; your_namespace.Bar = function(arg)
{
alert(arg); }; with(your_namespace) {
Bar(Foo.toAlert); }
저는 보통 폐쇄형으로 만듭니다.
var MYNS = MYNS
{};
MYNS.subns = (function() {
function privateMethod() {
// Do private stuff, or build internal.
return "Message";
}
return {
someProperty: 'prop value',
publicMethod: function() {
return privateMethod() + " stuff";
}
}; })();
이 글을 쓴 이후 몇 년 동안 내 스타일은 조금씩 바뀌었고, 나는 지금 이렇게 결말을 쓰고 있다.
var MYNS = MYNS
{};
MYNS.subns = (function() {
var internalState = "Message";
var privateMethod = function() {
// Do private stuff, or build internal.
return internalState;
};
var publicMethod = function() {
return privateMethod() + " stuff";
};
return {
someProperty: 'prop value',
publicMethod: publicMethod
}; })();
이렇게 하면 퍼블릭 API와 구현을 이해하기 쉬워집니다.return 스테이트먼트는 구현에 대한 퍼블릭인터페이스라고 생각하시면 됩니다