2013-01-16 17 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

相关问题