2012-02-24 7 views
1

야후 유이 블로그 (YUI Blog)에서 제안한 모듈 패턴에 대해 최대한 많이 공부했습니다.다른 이름의 객체를 덮어 쓰지 않고 빈 이름 공간 객체를 만들려면 어떻게해야합니까?

나는 유이가 이렇게 같은 동일한 이름의 기존 하나를 덮어 쓰지 않고 새로운 빈 공간 객체를 생성 할 수있는 기능을 제공하는 것으로 나타났습니다 : 다음 전화를 사용할 수 있습니다

YAHOO.namespace("myProject");

YAHOO.myProject

(알림 : YAHOO.myProject이 이미 존재하는 경우는 덮어 쓰기되지 않습니다) I 일반 자바 스크립트를 사용하여 비슷한 효과를 얻을 수있는 방법

, 그리고 w 유이를 사용하지 않고?

가능한 한 자세하게 설명하십시오.

이 작업이 완료된 전체 YUI 블로그 기사는 here입니다.

내가 배우고 내 자바 스크립트 지식과 기술을 srengthening 나처럼

, 나는 그것이 이런 식으로 일할 수있는 당신의 예에서

답변

2

(나는 그것을 사용할 필요가 없습니다 경우에도) 내 자신의 개인 자바 스크립트 라이브러리를 작성하는 것을 시도하고있다 :

if (!YAHOO.myProject) { 
    YAHOO.myProject = {}; 
} 
YAHOO.myProject.whatever = true; 

또는 자신의 부모 모듈 이름 사용 :

var myModule = myModule || {}; // make sure parent is defined without overwriting 
if (!myModule.myProject) { 
    myModule.myProject = {}; 
} 
myModule.myProject.whatever = true; 

또는 자신의 네임 스페이스 기능을 정의

function myNamespace(item) { 
    if (!myModule[item]) { 
     myModule[item] = {}; 
    } 
} 

myNamespace("myProject"); 
myNamespace.myProject.whatever = true; 
+0

좋아하지만,'myModule.myProject' 이미 방금 작성한 코드는'myProject' 개체를 방지하지 않을 존재하는 경우 창조되는 것에서? – person0

+0

@Proud_to_be_Noob - 네임 스페이스 초기화 시점은 초기화되지 않은 경우 초기화하고 존재하면 그대로 두는 것입니다. 이것이 바로이 코드의 기능입니다. 다른 일을하려고합니까? – jfriend00

+0

YUI 사람들이 네임 스페이스 함수를 사용할 때 YUI 사람들이 무슨 일이 일어나는지 이해하려고합니다. 그 이유는 그들의 문구가 겹쳐 쓰지 않고 빈 복제 객체를 만들 수 있다는 것을 의미하기 때문입니다. 나는 또한 보여지고있는 것을 기본적으로하는 좋은 방법을 찾아 내려고 노력하고있다. (방금 방금 게시 한 내 네임 스페이스 함수 정의가 마음에 듭니다. 감사합니다.). – person0

1

Q. 같은 이름의 다른 개체를 덮어 쓰지 않고 빈 이름 공간 개체를 만들려면 어떻게해야합니까?

수 없습니다. 정의 상으로는 동일한 이름이 새 빈 객체와 기존 객체를 모두 참조 할 수 없습니다.

당신이 다음 방금 이렇게, "어떻게, 그렇지 않으면 내가 기존에 추가 할, 이미 존재하지 않는 경우에만 빈 공간 객체를 생성 확인할 수 있습니다"을 의미하는 경우 :

if (!YAHOO.myProject) 
    YAHOO.myProject = {}; 

// or you may see this variation: 
YAHOO.myProject = YAHOO.myProject || {}; 

나는 후자를 좋아하지 않지만 보통의 if 문과 같은 효과를 내기 위해 자주 사용된다. http://www.adequatelygood.com/2010/3/JavaScript-Module-Pattern-In-Depth

UPDATE :

많은 더이 글을 한 번 봐 가지고이 일반적인 원칙을하려면 YUI API documentation for YAHOO.namespace()에 따르면를, 방법은 "네임 스페이스가 지정된 반환하고 존재하지 않는 경우를 생성 "- 당신이 읽는 블로그의 말씨보다 훨씬 덜 모호하고, 내가 이미 말한 것을 뒷받침 해줍니다 ...

+0

방금 ​​전에 말했던 모든 것을 이해합니다. 이전에 생각했던 것과 똑같습니다. 그렇다면 YAHOO YUI 블로그에서 "YAHOO 멤버로 myProject를 할당합니다 (하지만 myProject를 덮어 쓰지는 않습니다. 이미 존재합니다. 이제 YAHOO.myProject에 회원을 추가 할 수 있습니다. " YUI는 어쨌든 복제 된'myProject'를 대체 이름으로 자동 재 할당합니까? – person0

1

편집 그냥 내가 당신의 질문에 직접 대답하지 않는다는 것을 깨달았습니다. . 죄송합니다! 그러나이 방법을 사용하면 몇 가지 대체 기술을 이해하는 데 도움이됩니다.

이것은 때때로 속성이나 기능을 한 번 추가하고 나중에 덮어 쓰지 않으려는 경우와 같이 자주 사용하는 기술입니다.

var module = new function(){ 

     var modules = {}; //internal module cache 

     return function(name, module){ 
      //return all modules 
      if(!name) return modules; 

      //return specific module 
      if(modules[name]) return modules[name]; 

      //return the module and store it 
      return modules[name] = module; 
     } 

    } 

그래서 당신과 같이 사용할 수 있습니다 : 보는

//will store this since it doesn't exist 
module('test', 'foo'); //Since 'test' doesn't exist on the internal 'modules' variable, it sets this property with the value of 'foo' 

module('test'); // Since we aren't passing a 2nd parameter, it returns the value of 'test' on the internal 'modules' variable 

module('test', 'bar'); //We are attempting to change the value of 'test' to 'bar', but since 'test' already equals 'foo', it returns 'foo' instead. 

module(); // { 'test': 'foo' } //Here we aren't passing any parameters, so it just returns the entire internal 'modules' variable. 

중요한 것은 우리가 '새로운 기능을()'를 사용하고 있다는 점이다. 이것은 할당시에 수행됩니다. 왜냐하면 우리는 실제로 '모듈'을 외부 함수가 아니라 내부 함수로 만들기를 원하기 때문입니다. 그러나 내부 'var 모듈'변수에 대한 클로저를 만들려면 외부 함수가 할당에서 실행되어야합니다.

또한 외부 함수를 작성할 수 자체가 너무 실행되는 것을 알 수 :

var module = function(){ 
    var modules = {}; 
    //other stuff 
}(); 
+0

두 번째 섹션에서 사용 방법을 보여줄 수 있습니다. 첫 번째 부분을 이해합니다. 두 번째 부분을 확실히 이해하고 싶습니다. 'module ('test2', 'foo2');를 추가하면 두 번째 섹션의 코드에서 어떤 일이 발생합니까? – person0

+0

그런 다음 'test2'라는 내부 모듈 객체에 새 속성을 추가합니다. 'foo2'. 기본적으로 나중에 속성을 변경할 필요없이 한 번 속성을 설정할 수 있습니다. – Geuis

+0

좋아, 나는 그것이 내가 의미하는 바를 이해할 수 있다고 생각한다. 코드가 어떻게 이들 각각의 'module ('test ','foo ')에 반응하는지 더 설명 할 수있다; module ('test'); // 'foo' 모듈 ('test', 'bar'); // foo module(); // { 'test': 'foo'}'그리고 그들 각각은 무엇을합니까? – person0