2011-03-02 3 views
2

천천히 성장하고있는 작은 라이브러리를 개발하고 있습니다. 그런 이유로 필자는 모든 기능을 myNamespace에 넣기 때문에 추한 충돌을 피하고 별도의 파일로 분리하여 코드 관리가 쉬워졌습니다. 불행히도, 내가 그렇게했을 때 이전에 사용했던 것들을 깨뜨린 것입니다. 즉 Array 객체의 기능을 확장했습니다.내 네임 스페이스에있는 객체 확장하기

if(myNamespace === undefined) { 
    var myNamespace = {}; 
} 

myNamespace.myArray = { 
    height: 0, 
    width: 0 
}; 

myNamespace.myArray.prototype = []; 

을 이제 내가 할 때 :

testArray = myNamespace.myArray; 

내가 할 수있을 수없는 것 : 그 문제가 해결되지 내 초기 접근했다

testArray.push("test"); 

어떻게 나는 고쳐? 네임 스페이스에 코드를 캡슐화하는 최선의 방법은 무엇입니까? 나는 그것이 정의 된/인스턴스화 된 객체를 혼란 스럽다는 것을 확신하지만, 실제로 그것을 수행하는 적절한 방법을 모른다.

+0

정확히 무엇이 파손되었는지 자세히 설명해 주시겠습니까? 지금 게시 한 코드는 실제 기능을 전혀 보여주지 않습니다. – casablanca

+0

그래, 좀 더 분명하게해야 겠어. 나는 그 질문을 편집 할 것이다. –

+0

[나를위한 작품] (http://jsfiddle.net/alexdickson/KavXu/). – alex

답변

1

이것은 네임 스페이스 문제는 아니며 클래스를 정의하고 인스턴스화하는 방법에 관한 것입니다. 수업은하지 객체 리터럴 등의 함수로 정의됩니다

// define your class 
ns.MyArray = function(w, h) { 
    this.width = w; 
    this.height = h; 
}; 

// set the class prototype 
ns.MyArray.prototype = []; 

// instantiate 
var a = new ns.MyArray(5,10); 
a.push("Test"); 
a.length; // 1 
a[0]; // "Test" 
a.width; // 5 

당신이 바로이 같은 리터럴 객체를 생성하고, 생성 된 testArray 변수에 할당되는 일을하는지 :

var o = {}; 
var testArray = o; 
testArray == o; // true 

이 동작을 예상했는지는 확실하지 않지만 {width:0, height:0}과 같은 개체 리터럴을 prototype 할당하면 실제 ""이라는 실제 키가있는 일반 필드가 추가됩니다. 실제 prototype은 여전히 ​​Object입니다.

+0

감사합니다. 나는 방금 자바 스크립트로 놀기 시작했고 구문을 가지고 여전히 고심하고있다. –

관련 문제