2011-06-13 4 views
1

누구나 어떻게 작동하는지 설명 할 수 있습니까?자바 스크립트 중첩 된 네임 스페이스 생성 코드 설명이 필요합니다

var MYAPP = {}; 
MYAPP.namespace = function(name){ 
    var parts = name.split('.'); 
    var current = MYAPP; 
    for (var i in parts) { 
     if (!current[parts[i]]) { 
      current[parts[i]] = {}; 
     } 
     // shouldn't this line override the MYAPP object with all it's properties? 
     current = current[parts[i]]; 
    } 
} 
+0

작성합니다. ** 값 ** MYAPP를 덮어 쓰지 않습니다 – Raynos

답변

2

current 같은 먼저 후속 적 MYAPP의 갓 속성에 대한 참조를 할당 name.split로부터 어레이의 모든 부분에 대해 루프 내에서, 그 후, MYAPP참조 할당된다. 그래서 아무 것도 덮어 쓰지 않습니다. 왜냐하면 모두 참조입니다. 예를 들어 단어에서

이 발생 MYAPP.namespace(foo.bar)을 실행할 경우 :

  • 첫째 : current 점을 MYAPP
  • 지금 루프로 이동합니다.
    • MYAPP.foo
    • MYAPP.foo.bar
  • : current /*is ref to MYAPP*/ .foo이 존재하지 않는 경우, MYAPP.foo
  • 이하자 마침내 MYAPP 포함 그것을
  • 을 만들 존재하지 않는 current /*is now ref to MYAPP.foo*/ .bar 경우 MYAPP.foo
  • -current 포인트 작성에 동일한 번호를 할당하려는 경우객체 리터럴을 사용하여 MYAPP.namespace(foo.bar), 당신은 그 줄은 MYAPP``을 가리키는 ** 포인터 **`current`을 _overwrites_
    • var MYAPP = { foo: { bar: {} }
+0

감사합니다. 문제는 MYAPP.foo에서 MYAPP.foo.bar 로의 재 할당이 나를 혼란스럽게 만들었습니다. 훌륭한 설명입니다. 다시 한 번 감사드립니다. – orustam

0

이 모든 것이 실제로 빈 개체를 초기화합니다.

당신이 다음 MYAPP.fooMYAPP.foo.bar에서 다시 한 빈 개체 ({})를 생성합니다 MYAPP.namespace('foo.bar') 전화

. 그런 다음 함수와 변수를 MYAPP.foo.bar에 추가 할 수 있습니다.

0

namespace 메서드를 사용하면 MYAPP 개체에 중첩 된 개체를 만들 수 있습니다.

당신이 MYAPP.namespace('foo.bar')를 호출하면이됩니다 그렇지 않은 경우를 만들 MYAPP.foo이 존재

  • 선택하면합니다.
  • MYAPP.foo.bar이 있는지 확인하고 그렇지 않은 경우 생성하십시오.
0

코드 샘플을 사용하여 설명하겠습니다. 이 코드를 참조하십시오. var MYAPP = {} 지금 남겨두면 전역 빈 객체가 생성됩니다. MYAPP.namespace는 개체에 대한 인스턴스 방법이며 나는이 MYAPP.namespace("ice.cream") 가 개별적으로 그리고 네 그 역할을 MYAPP.ice.Cream 같은 이전의 존재를 확인하여 두 개의 내부 객체를 생성 할 때, 빠른 미리보기로 를 얻을 수 있습니다 MYAPP.namespace("foo.bar")

처럼 사용할 수 있습니다 line은 초기 MYAPP 객체를 덮어 쓰거나, 그 행을 제거하거나, 네임 스페이스 메소드를 전역 유틸리티로 추상화합니다. Utils.registerNameSpace("MYAPP.Ice.Cream");

관련 문제