2010-12-07 7 views
1

저는 네임 스페이스로 사용하고있는 객체 리터럴을 만들고 있습니다. 객체 리터럴 (네임 스페이스)에는 생성자 함수 MyConstructor가 포함됩니다. 개체 리터럴 내 MyConstructor 프로토 타입을 확장하고 싶습니다. MyConstructor 선언을 끌어 와서 myNamespace 선언 위에 올려 놓으면 MyConstructor가 더 이상 myNamespace에 의해 네임 스페이스가 아닌 것을 제외하면 모두 잘됩니다. 이 작품을 만드는 가장 좋은 방법은? '.'파일의
이 (가) 컴파일되지 않습니다. 이 줄의 내용은 다음과 같습니다.객체의 프로토 타입 선언하기 리터럴

MyConstructor.prototype = { 

아래에 제공된 개체 리터럴.

감사합니다, 마이크

var myNamespace = { 
    a: 3, 
    b: function (msg) { 
     alert(this.a); 
    }, 
    MyConstructor: function(xx) { 
     this.x = xx; 
    }, 
    MyConstructor.prototype = { 
     a: 1, 
     b: function() { 
      return true; 
     } 
    } 
}; 

업데이트 : 허용되는 솔루션은 작동합니다. 그러나, 나의 질문의 전제는 결함이 있었다. 이 상황에서는 객체 리터럴을 사용하지 않을 것입니다. 왜냐하면 내가 발견 한 것처럼 단위 테스트가 더 어렵 기 때문입니다. 대신, 나는 생성자로 생성 된 일반 객체를 사용하고, 내부에 개인 객체를 넣을 것이다. 또 다른 것은, "자기/즉시 실행 기능", 어떤면에서는 아름답지만 초보자에게 설명하기가 약간 어렵습니다.

답변

5

개체 리터럴에서는 그렇게 할 수 없습니다. 죄송합니다.

해결 방법은 함수를 사용하여 myNamespace을 생성하는 것입니다. 그 방법은 문자 그대로 일 필요는 없습니다,하지만 당신은 여전히 ​​네임 스페이스의 효과를 얻을 수 있습니다 :

var myNamespace = (function(){ 

    var ns = { 
    a: 3, 
    b: function (msg) { 
     alert(this.a); 
    }, 
    MyConstructor: function(xx) { 
     this.x = xx; 
    } 
    }; 

    ns.MyConstructor.prototype = { 
    a: 1, 
    b: function() { 
     return true; 
    } 

    return ns; 
}()); 

은 그래서 여기에서 일어나는 MyNamespace에 즉시 호출하고 함수의 값으로 설정이다 는 실제 네임 스페이스 객체를 반환합니다. 함수에있는 다른 코드는 액세스 할 수 없지만 함수 내부에 있으므로 객체 리터럴이 아닌 모든 작업을 수행 할 수 있습니다.

+0

귀하와 meouw는 모두 정확했으며 둘 다 실시간으로 응답했지만 답변 중 하나만 선택할 수있었습니다. 둘 다 감사합니다. – Mike

5

그냥 네임 스페이스

var myNamespace = { 
    myConstructor: function(x) { 
     this.x = x; 
    } 
} 

myNamespace.myConstructor.prototype = { 
    //... 
} 

또는 다른 변형

var myNamespace = (function(){ 

    function myConstructor(){} 

    myConstructor.prototype = {}; 

    return { 
     myConstructor: myConstructor 
    } 

})(); 
+0

아우, 당연히 가장 쉬운 방법입니다. 내 복잡한 방식의 힌지가 숨겨져있는 경우에도이 기능을 사용하여 계속 사용할 수 있습니다. 그러나 이것은 분명 더 간단한 해결책입니다. – Jakob

+0

이 예제에서는 작동합니다. 문제는 내 실제 객체 리터럴이 MyConstructor의 프로토 타입에있는 것들을 참조하는 다른 함수를 가지고 있다는 것입니다. – Mike

+0

Jakob이 내 두 번째 변형을 제안했습니다. – meouw

0

방법을 사용), 대한 myConstructor와를 반환하는 발전기 함수를 작성, 어떤 문제를 해결합니다. createMyConstructor라는 함수를 만든 다음 즉시 호출하면 원하는 것을 반환합니다.

var myNamespace = { 
    a: 3, 
    b: function (msg) { 
     alert(this.a); 
    }, 
    MyConstructor: (function createMyConstructor() { 
     var cons = function(xx) { 
      this.x = xx; 
     }; 
     cons.prototype = { 
      a: 1, 
      b: function() { 
       return true; 
     }; 
     return cons; 
    })() 
};