2013-01-07 76 views
0

我在nodejs中使用JSON-RPC庫。我按名稱註冊我的函數(例如rpc({publicName: privateFunction})),RPC lib爲我調用函數,並處理編組JSON和函數參數。它適用於簡單的函數,但當它傳遞一個原型函數(一個在對象的原型鏈上定義的函數)時會中斷。問題是RPC lib正在調用使用apply的函數,該函數改變了this的上下文,因此我無法再訪問其他原型屬性/函數。JS原型函數'this'混淆

這是問題的一個例子:

var MyObj = function(prop1,prop2,prop3){ 
    this.prop1 = prop1; 
    this.prop2 = prop2; 
    this.prop3 = prop3; 
} 

MyObj.prototype.showProps = function(separator){ 
    console.log(this.prop1 + separator + this.prop2 + separator + this.prop3); 
} 

var myObjInstance = new MyObj('a', 'b', 'c'); 
myObjInstance.showProps(','); 

// displays a,b,c 


// I register the function as rpc({show_props:myObjInstance.showProps}) and the RPC lib calls it like 
myObjInstance.showProps.apply(this, [',']); 

// displays undefined,undefined,undefined 

是否有更好的方法來解決這一問題?有沒有辦法在原型函數內部保留this的上下文?

回答

3

您可以使用Function.bind()將特定上下文綁定到函數。這在所有環境中都無濟於事,但如果您需要傳統支持,則可以在MDN頁面上使用它。

因此,在您例如,你可以添加:

myObjInstance.showProps = myObjInstance.showProps.bind(myObjInstance); 
+2

它是可用的NodeJS。 – pimvdb

+0

Luv it!完美的作品。謝謝! – jckdnk111

0

在最後一行:

myObjInstance.showProps.apply(this, [',']); 

this指向全局範圍(或​​任何範圍你在這一點是,它不myObjInstance)。你應該這樣稱呼它:

myObjInstance.showProps.apply(myObjInstance, [',']); 

第一個參數是上下文,它應該是你的對象實例。

+3

我的理解是,這是庫代碼,並在他的控制之外 –