2010-04-08 2 views
1

네임 스페이스가 지정된 함수를 사용할 때 원하는 개체를 참조하는 데 문제가 있습니다. 여기네임 스페이스가 지정된 함수에서 원하는 개체를 참조하는 중

없음 문제 :

obj.namespace.test = function() { 
    // this == namespace 
} 

은 후자의 예에서, 내가 this 참조 namespace 알고 있지만 나는 obj를 참조 할 :

obj.test = function() { 
    // this == obj 
} 

하지만가 넘어지고있어 나는 네임 스페이스 없을 때 . 내가 어떻게 해?

답변

1

다른 사람들은 몇 가지 좋은 제안을했습니다.

그냥 네임 스페이스를 obj를 가리키는 변수와 원하는 멤버 함수를 가리키는 개체로 반환하는 함수를 추가 할 수도 있습니다.

예 :

// Note that "namespace" is a reserved word in JS for some reason, 
    // so you can't use it as a variable/function/etc name. 
    var myNamespace = function myNamespace(){ 
     var that = this; 

     var test = function test(){ 
      //in here use this.that to point to obj 
      alert(this.that.name); 
     }; 

     return {that: that, test: test}; 
    }; 

    // Then create the obj: 
    var obj = { name: "Mr. Ahb Jeckt", myNamespace: myNamespace}; 

    // Then you can just call the "namespace" and member function like this: 
    obj.myNamespace().test(); 


    //Or, "initialize" the namespace and call it like so: 
    obj.myNamespace = obj.myNamespace(); 
    obj.myNamespace.test(); 

    obj.name = "Mrs Ahb Jeckt"; 
    obj.myNamespace.test(); 

이 방법은 거기에 "네임 스페이스"자체 obj와 어떤 하드 코딩 된 참조가 있고, 나는 그것이 매우 깨끗 생각합니다.

obj가 "클래스"인 경우에도 작동합니다. obj를 객체 리터럴 대신 생성자로 만듭니다.

// Then create the obj: 
var obj = function (name){ 
    this.name = name || "unnamed"; 
    this.myNamespace = myNamespace; 

    // Initialize the namespace, we can leave this out and just reference 
    // obj.myNamespace() each time as well 

    this.myNamespace = this.myNamespace(); 
}; 

// Then you can just call the "namespace" and member function like this: 

var myObj = new obj("Mr Ahb Jeckt"); 
myObj.myNamespace.test(); 

var myObj2 = new obj("Mrs Ahb Jeckt"); 
myObj2.myNamespace.test(); 
1

이 간단한 대답은 없지만, 당신은 몇 가지 옵션이 있습니다 :이 obj에 바인딩되는 함수를 반환

obj.namespace.test = function() { 
    return (function() { 
    // this == obj 
    }).apply(obj, Array.prototype.slice.call(arguments)); 
}; 

. 죄송합니다. obj을 다시 할당하면 라이브 참조이기 때문에 작동하지 않습니다. 이것은 더 강력합니다 :

obj.namespace.test = (function (obj) { 
    return function() { 
    return (function() { 
     // this == obj 
    }).apply(obj, Array.prototype.slice.call(arguments)); 
    }; 
}(obj)); 

위에서 볼 수 있듯이 이들 중 어느 것도 매우 깨끗합니다. 먼저 this에 의존하는 이유를 스스로에게 물어보십시오. 보통 obj에 대한 참조를 사용하는 것이 분명 가장 쉬운 방법입니다.

관련 문제