2015-01-11 66 views
0

根據問題的標題可能有幾個重複的問題,但我有一個非常具體的情況。node.js:瞭解對象原型

我建立以下

var myModule = function() { 
    // do something init 
}; 

myModule.prototype.a = 10; 
myModule.prototype.b = 20; 

myModule.prototype.method1 = function() { 
    // in this method I can access a and b using this 
    this.a 
    this.b 
}; 

myModule.prototype.method2 = function() { 
    // I can call method1 here 
    this.method1(); 
}; 

節點模塊的代碼示例這將能正常工作提到

var myModule = require('myModule'); 
var instance = new myModule(); 

以下情況下調用實例方法2將罰款

instance.method2 // this should work fine 

現在假設我將method2作爲回調函數傳遞給表達式或任何其他函數下面

someobject.performsomeasync(instance.method2); // this will fail 

就好像我瞭解關於JavaScript的原型是,上述將在這種情況下this將參考主叫對象,它是不是instance

如何使它工作,因爲失敗? 我在做什麼被認爲是一種很好的編碼習慣?

回答

1

您可以通過bind方法提供this

someobject.performsomeasync(instance.method2.bind(instance)); 

另一種解決方案:

someobject.performsomeasync(function() { 
    instance.method2(); 
}); 

UPD1

經過我們的討論,您希望您的對象的方法總是 將在目標背景下執行t實例。那麼你可以這樣做:

var myModule = function() { 
    this.method1 = method1.bind(this); 
    this.method2 = method2.bind(this); 
}; 

myModule.prototype.a = 10; 
myModule.prototype.b = 20; 

function method1() { 
    // in this method I can access a and b using this 
    this.a 
    this.b 
}; 

function method2() { 
    // I can call method1 here 
    this.method1(); 
}; 

但這是非常糟糕的風格。您的圖書館的用戶是JavaScript開發人員。所以他們必須知道你是否通過像someobject.performsomeasync(instance.method2)那樣的回調,你只是傳遞了對象的方法,而不是上下文。所以他們必須使用bind來提供上下文。

PS順便說一下,我建議你不要在原型中定義對象的屬性。定義剛纔的方法(也許也是常量)。這是非常容易出錯的。例如,如果你的財產是對象,那麼有人可以寫出下面的代碼:

instance.someobject.a = 10; 

,他會改變asomeobject財產所有實例。

+0

由於我正在構建一個npm模塊,我無法控制使用情況 – Syed

+0

@Syed其實,我並不完全理解你的問題?你是什​​麼意思「不能控制使用」?您正在編寫模塊,因此您正在創建模塊用戶將使用的界面(您將在文檔中描述)。你能解釋一下什麼讓你感到困惑嗎? – alexpods

+0

正如我已經提到的,我不能控制你提出的代碼作爲解決方案。它是npm模塊,用戶可以以任何他們想要的方式調用函數。 – Syed