2015-02-11 34 views
1

我遇到了問題,我需要傳遞一個對象的方法作爲回調,並且該方法使用this。顯然這是行不通的,因爲當作爲回調調用時(不是通過擁有對象)this會指向全局對象。將對象的方法作爲回調傳遞的最佳或最常用的方法是什麼?

我讀過關於這個問題的解決方案,我在想最好或最常見的是什麼。

目前,我的 '階級' 是這樣的:

function MyClass(value) { 
    this.value = value; 
} 

MyClass.prototype.alertValue = function() { 
    alert(this.value); 
}; 

選項A - 更改類看起來像這樣:

function MyClass(value) { 
    this.value = value; 

    this.alertValue = function() { 
     alert(value); 
    }; 
} 

的優點 - 簡單。但缺點是alertValue將被複制到每個實例上,這就是我們通常將方法放在prototype上的原因。

選項B - 使用.bind()

callbackReceivingFunction(myObject.alertValue.bind(myObject)); 

我可以寫這樣的實用方法:

function bind(object, methodName) { 
    return object[methodName].bind(object); 
} 

什麼來解決這個問題最常用的方法?它有什麼優點和缺點?我提出的兩種方式看起來都很不雅,還有另一種方式嗎?

+0

你能舉一些實際的例子?我認爲提供對象非靜態方法作爲回調是不直觀的。回調通常是更普遍的東西,就像一個函數,而不是綁定到任何特定的對象。這就像一個動作。 – 2015-02-11 22:20:13

+1

使用'bind'不雅?這是它應該涵蓋的教科書情況之一。 – Jon 2015-02-11 22:24:54

+0

@Jon所以就像'功能(myObject.alertValue.bind(myObject));'常見和認爲沒關係? – 2015-02-11 22:26:35

回答

1

我會建議使用bind()。請記住,IE < = 8不支持Function.prototype.bind(),因此您需要使用polyfill。如果你必須爲一個類綁定一堆方法,請查看Underscore/lodash's _.bindAll() method

例如:

_.bindAll(myObj, 'alertValue', 'otherMethod', 'anotherMethod') 
相關問題