2013-01-16 7 views
8

私は 'function'テクニックを使って簡単な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); 
    } 
} 

あなたはjQueryのを使用していることから、Array#indexOfを持っていない可能性がIE6のような本当に古いブラウザをサポートする必要がある場合は、代わりにjQuery.inArrayを使用できます。

+1

関数に 'toString()'が適用されているか、機能が同じであれば – Amberlamps

+1

@Amberlamps:他のオブジェクトと同様に、単にアイデンティティの比較です。 –

+0

@FelixKling:そうです、そのアイデンティティ比較は匿名関数でも機能しますか? – Amberlamps

関連する問題