class Observer{
constructor(){
this._dataStore = {};
}
/**
* @author web得胜
* @param {String} type 事件类型 必填
* @param {Function} fn 事件处理函数 必填
* @param {Object} ctx 函数的执行上下文 选填
* @desc 注册事件处理函数
* */
regist(type, fn, ctx=null){
if(this._dataStore[type]){
this._dataStore[type].push({fn,ctx});
}else{
this._dataStore[type] = [{fn,ctx}];
}
}
/**
* @author web得胜
* @param {String} type 事件类型 必填
* @param {*} 处理函数的参数列表 选填
* @desc 触发事件
* */
fire(type, ...args){
console.log(args);
this._dataStore[type].forEach((item,index) => {
item.fn.call(item.ctx, ...args);
});
}
/**
* @author web得胜
* @param {String} type 事件类型 必填
* @param {Function} fn 事件处理函数 必填
* @desc 移除事件处理函数
* */
remove(type, fn){
if(this._dataStore[type]){
this._dataStore[type].forEach((item,index) => {
if(item.fn === fn){
this._dataStore[type].splice(index,1);
}
});
}
}
}
function solid(){
console.log(this.name);
}
function zds(){
console.log(this.name);
}
function fzy(arg1,arg2,arg3){
console.log(arguments);
}
const ob = new Observer();
const solidCtx = { name: "solid" };
const zdsCtx = {name: "zds" };
// 注册事件
ob.regist("click", solid, solidCtx);
ob.regist("click", zds, zdsCtx);
ob.regist("dblclick", fzy);
// 移除事件
// ob.remove("click",zds);
// 触发(发布)事件
ob.fire("click");
ob.fire("dblclick",1,2,3);