2013-01-16 19 views
8

我已經使用'函數'技術創建了一個簡單的JavaScript類。 在這個類中,我有一個websocket監聽器,它在接收到某個消息時觸發一個函數。 我可以很容易地添加外部回調,如下所示如何將多個回調添加到JavaScript方法?

function MyClass() { 
    self = this; // to access main object from methods 

    // websocket definition 

    function websocketMessageInterpreter(message){ 
     if(message == "Hello!") onHelloMessageBase(); 
    } 

    function onHelloMessageBase(param){ 

    // call user defined callback 
    self.userDefinedCallback(param); 
    } 
    this.userDefinedCallback= function(param){}; //default empty callback 
} 

對外我用這個作爲

var myObject = new MyClass(); 
myObject.userDefinedCallback = function(){alert("Someone said hello!");}; 

是否有一種模式,我可以做這樣的事情?

myObject.userDefinedCallback += function1; 
myObject.userDefinedCallback += function2; 

,也許以後

myObject.userDefinedCallback -= function1; 
+0

你可以在回調中編寫[嵌套函數](http://stackoverflow.com/questions/7295634/javascript-nested-function) – Johnny000

回答

11

通常的方式做到這一點是有回調的數組,像addCallback(callback)removeCallback(callback)方法,讓API的用戶添加和刪除回調。

addCallback基本上是:

function addCallback(callback) { 
    if (this.callbacks.indexOf(callback) < 0) { 
     this.callbacks.push(callback); 
    } 
} 

removeCallback基本上是:

function removeCallback(callback) { 
    var index; 
    if ((index = this.callbacks.indexOf(callback)) >= 0) { 
     this.callbacks.splice(index, 1); 
    } 
} 

如果您需要支持真的老的瀏覽器IE6一樣可能沒有Array#indexOf,因爲你使用jQuery,你可以使用jQuery.inArray代替。

+1

是否將toString()應用於函數,或者如何實際比較兩個函數函數,如果它們是相同的? – Amberlamps

+1

@Amberlamps:這是一個簡單的身份比較,就像任何其他對象一樣。 –

+0

@FelixKling:好的,那個身份比較也適用於匿名函數? – Amberlamps

相關問題