2014-04-01 1 views
1

여기 상황이 있습니다. 의이 예를 보여 드리죠 :많은 다른 개체의 기능에 대한 별칭을 가진 개체를 만드는 방법

여기
function ScrewDriver(){ 
    var data = ...; 
    this.driving = function(){ 
     //Some Stuff Here 
    } 
} 

function Hammer(){ 
    var data = ...; 
    this.stomp = function(){ 
     //Some Stuff Here 
    } 
} 

function MultiTools(){ 
    this.screwDriver = new ScrewDriver(); 
    this.hammer = new Hammer(); 
} 

은 예제의 기본이다. 이제 multiTools에서 역동적으로 도구 기능을 리디렉션하고 싶습니다. 의 자신을 설명하자

function Work(){ 
    this.tools = new MultiTools(); 
    this.tools.screw(); // I want to user directly the function of the proper object 
    this.tools.hammer.stomp(); // Not like this; 
} 

내가 그 같은 것을 생각하고 있었는데 :

function MultiTools(){ 
    this.screwDriver = new ScrewDriver(); 
    this.hammer = new Hammer(); 
    for(var prop in this.screwDriver){ 
     this[prop] = this.screwDriver[prop]; 
    } 
    //Same for each object 
} 

을하지만 자식 객체 함수에서 자식 객체 데이터에 액세서 만약 내가 '때문에 내가 원하는 것처럼 작동하지 않습니다 오류가 발생합니다. this.tools.screw()를 호출 할 때; 나는 현실적으로 this.Tools.screwDriver.screw(); 결국 나는 리다이렉션을 원한다.

누군가가 이것을하는 법을 알고 있습니까?

미리 감사드립니다.

답변

2

당신은 .bind()를 사용할 수 있습니다

함수가 호출 될 때, 그들은 this의 정확한 값을해야 보장
this[prop] = this.screwDriver[prop].bind(this.screwDriver); 

. 당신은 당신의 멀티 툴에 대한 일반적인 함수를 작성할 수

오브젝트 :

function MultiTools() { 
    var multitool = this; 
    function promoteMethods(subobj) { 
    for (var prop in subobj) 
     if (typeof subobj[prop] == 'function') 
     multitool[prop] = subobj[prop].bind(subobj); 
     else 
     multitool[prop] = subobj[prop]; 
    } 

    promoteMethods(this.hammer = new Hammer()); 
    promoteMethods(this.screwDriver = new ScrewDriver()); 
    // ... 
} 
관련 문제