Function的扩展(2):多播事件

在个人上一篇博文《Function的扩展(1):继承》中已经对扩展function这个函数以实现继承。
c#

按照写文章的顺杆爬理论我就在这一篇和你们聊一下经过对Function的扩展实现多播事件吧。。 app


对于监听者模式有些朋友可能很熟悉,也有些朋友可能不太了解。可是对于事件。相信几乎没有人没用过吧。。 ide

在Js中,咱们每每是采用相似如下代码的方式来进行事件的编写与调用。 函数

var eventDemoClass= function () {
    //constructor
}
eventDemoClass.prototype = (function () {
    //private
    return {
        //public   
        OnDoSomeStaff:null,
        DoSomeStaff:function(){
           // some function code
           if(this.OnDoSomeStaff){
                 this.OnDoSomeStaff(object,args);
           }
        }
    };
})();
var c=new eventDemoClass();
c.OnDoSomeStaff=function(){
      alert("staff was done");
}
c.DoSomeStaff()

这样写很简单同时在只会有一个方法进行注册的时候也颇有效。 this

可是若是咱们须要像c#的事件同样注册多播事件又该怎么办呢?
prototype

老规矩。核心代码呈上。 code


//注册事件方法
//@param eventName:事件名
//@param func:进行注册的方法
//@param executor:执行上下文对象 若是为空则使用默认上下文
Function.prototype.AddEventListener =
function (eventName, func, executor) {
    var eventFunc = function () {//多播事件执行关键方法
        var eventArray = arguments.callee.FunctionArray;
        var executorArray = arguments.callee.Executor;
        for (var i = 0; i < eventArray.length; i++) {
            var executor = executorArray[i];
            if (!executor) {
                executor = this;
            }
            eventArray[i].apply(executor, arguments);
        }
    }
    if (!this[eventName] || !this[eventName].FunctionArray) {
        this[eventName] = eventFunc;
        this[eventName].FunctionArray = [];
        this[eventName].Executor = [];
    }
    this[eventName].FunctionArray.push(func);
    this[eventName].Executor.push(executor);
}
//取消注册方法
//@param eventName:事件名
//@param funcHandle:取消注册的方法对象 若是不是注册时使用的原对象,
//将没法进行取消动做
Function.prototype.RemoveEventListener =
function (eventName, funcHandle) {
    if (this[eventName] && this[eventName].FunctionArray) {
        var index = this[eventName].FunctionArray.RemoveObject(funcHandle);
        if (index >= 0) {
            this[eventName].Executor.RemoveIndex(index);
        }
    }
}

仍是使用刚才定义的eventDemo类。 对象

调用代码以下 blog



var c=new eventDemoClass();
var listener=function(){alert("staff was done")}
c.AddEventListener("OnDoSomeStaff",listener,c);
c.DoSomeStaff();//将会弹出窗体
c.RemoveEventListener("OnDoSomeStaff",listener);
c.DoSomeStaff();//将不会弹出窗体

这样多播事件就实现了。 继承

相关文章
相关标签/搜索