2014-04-01 121 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 
} 

但它不工作像我想,因爲如果我查看在子對象數據的子目標函數I」會發生錯誤。當我調用this.tools.screw();我想在現實中this.tools.screwDriver.screw(); 終於我只想要一個重定向。

有人知道如何做到這一點?

在此先感謝。

回答

2

您可以使用.bind()

this[prop] = this.screwDriver[prop].bind(this.screwDriver); 

這保證了當函數被調用時,他們就會有this正確的值。

你可以寫你的多刀一般的函數對象:

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()); 
    // ... 
}