2010-06-06 54 views
3

我經常需要將方法從對象傳遞到其他對象。不過,我通常希望將方法附加到原始對象(通過附加,我的意思是'this'應該指向原始對象)。我知道有幾個方法可以做到這一點:如何在javascript中傳遞方法?

a)在對象的構造函數:ObjectA = function() { var that = this; var method = function(a,b,c) { that.abc = a+b+c }}

二)在對象A已通過對象B:objectB.assign(function(a,b,c) { that.method(a,b,c) })

C)這兩個對象外:objectB.assign(function(a,b,c) { objectA.method(a,b,c) })

我想知道是否有更簡單的方法來傳遞附加到其原始對象的方法。

回答

4

可以定義一個 「createDelegate方法」 方法的所有功能:

Function.prototype.createDelegate = function(scope) { 
    var method = this; 
    return function() { 
     return method.apply(scope, arguments); 
    } 
} 

然後使用類似:

var myDelegate = myFunction.createDelegate(myScope); 

叫 「myDelegate」 將執行 「myFunction的」 用 「這個」 指向「myScope」和傳遞給myDelegate的參數相同

+0

謝謝,這是完美的!雖然我還不明白。 – peterjwest 2010-06-06 11:13:48

+0

我編輯了一下,所以現在可能更清晰了。 如果不是,你可以問...... – ob1 2010-06-06 11:15:49

+0

也許值得看看Prototype的'Function#bind'的當前(1.7 RC 2)源,它的作用與ob1的'createDelegate'的作用相同,但它經歷了相當的幾個月前的性能測試和優化:http://github.com/sstephenson/prototype/blob/master/src/lang/function.js#LC108另外:我會使用'scope ||未定義「而不是」範圍||「窗口「,以避免不必要的瀏覽器特異性和覆蓋」window「的問題。調用''apply'使用'undefined'作爲範圍將使用全局對象。 – 2010-06-06 11:39:43

0

只要您用其適當的所有者對象調用其他方法,將始終引用正確的所有者。

+0

你如何提出我會這樣做?傳遞對象和一個代表方法的字符串:'assign(object,'method')'?我不希望方法名稱在其他對象中被硬編碼 – peterjwest 2010-06-06 11:07:37

0

你可以委託給你,如果你喜歡,或者只是請致電對象說l的ack從所定義的方法,所述方法scope-

instance.method.call(Other-Object/*,argument,...*/) 

例如,如果陣列有一個過濾器的方法,可以調用它,就好像它是一個節點列表對象的方法。

var list=document.getElementsByTagName('p'), a=[], 

list= a.filter.call(list,function(itm){return itm.className=='sidebar'});