2012-08-10 58 views
0

,而不是在node.js的,:動態添加對象的方法,我的上下文

dummy = require('dummy') 

dummy.aMethod() 
dummy.anotherMethod() 

我想用直接在我的上下文中的方法:

dummy = require('dummy') 
loadMethods(dummy) 

aMethod() 
anotherMethod() 

我怎樣才能實現函數loadMethods?

回答

2

一兩件事你可以做的是使用with,像這樣的:那不是,雖然推薦的,因爲它使很多東西含糊不清,沒有表現,你會期望他們

with (dummy) { 
    aMethod(); 
    anotherMethod(); 
} 

要完全按照您的要求進行操作,可以將這些方法添加到global對象中。您可以使用這樣的事情:

for (var prop in dummy) { 
    if (dummy.hasOwnProperty(prop)) { 
    global[prop] = dummy[prop]; 
    } 
} 

這種方法有其侷限性太大,雖然 - 例如,你不能在一個函數體中使用amethod方法(),該this對象將是錯誤的(當然, ,你可以使用bind來保持它的正確性)。而且,global並不是真正的全球性,而是模塊範圍的 - 所以每個模塊都有自己的global對象。

因此,權衡這些選項,您應該堅持使用通過dummy的方法。通過這種方式,您將始終獲得預期的行爲(this將爲dummy),並且您將清楚地指出您正在使用的方法實際在dummy模塊中實施並使用其狀態。找到一個好的IDE並輸入不應該是一個問題。

1

利用this的延展性。當函數被調用時沒有被綁定到this的特定範圍(可以通過.call.apply或在方法上下文中完成),那麼this引用全局對象。這段代碼可以在瀏覽器以及Node.js中使用,但是當然會覆蓋其他全局範圍的函數。謹慎使用......一般來說,我建議不要使用它。

function loadMethods(obj) { 
    for (var prop in obj) { 
     if (obj.hasOwnProperty(prop) && typeof(obj[prop]) === 'function') { 
      this[prop] = obj[prop] 
     } 
    } 
} 

您可以瞭解更多關於this背景here