发布-订阅模式/观察者模式发布-订阅模式也称为观察者模式。这是一对多的关系。多个订阅者可以订阅同一个事件。当事件被触发时,会通知订阅者执行订阅。绑定程序;我举个例子说明一下:某同学结婚时想邀请朋友B、C、D、E、F、G……来办婚礼。邀请列表其实就是订阅事件类PersonextendsEventEmitter{constructor(){super();}}letA=newPerson();functiondrinkFn(){console.log(`xx,xx,xxxx来xx酒店和我的婚礼!`)}A.on("marriage",drinkFn);同学A要结婚的时候,他会通知他的朋友XXX时间来XX酒店喝酒。这个过程就是释放事件A.emit("marriage");以下是我的实现过程:classEventEmitter{constructor(){this._count=null;}//订阅事件on(type,callBack,flag){//创建_events对象if(!this._events){this._events=Object.create(null);}//判断_events对象是否有type属性if(this._events[type]){if(flag){this._events[type].unshift(callBack)}else{this._events[type].push(callBack)}}else{this._events[type]=[callBack]}//如果type不是newListener类型,则执行对应的newListenerfunctionif(type!=="newListener"){this._events["newListener"]&&this._events["newListener"].forEach(fn=>{fn(type,callBack);})}//超过最大值绑定事件限制提示if(this._events[type].length>=this.getMaxListeners()){console.log("Exceededthemaximumbindingeventlimit")}}//订阅一次性事件once(type,callBack,flag){函数warp(...argments){callBack(...argments);this.removeListener(type,callBack)}warp.cb=callBack;this.on(类型,变形,标志);}//发布事件emit(type,...args){if(this._events[type]){this._events[type].forEach(fn=>{fn.call(this,...args)});}}//获取当前类型的数组对象eventlisteners(type){returnthis._events[type]||[];}//订阅事件并触发prependListener(type,callBack){this.on(type,callBack,true);}//订阅一次性事件,第一时间触发prependOnceListener(type,callBack){this.once(type,callBack,true);}//获取当前实例的所有事件类型eventNames(){returnObject.keys(this._events)}//获取当前类型的事件类型LengthlistenerCount(type){if(this._events[type]){returnthis._events[type].length}else{return0}}//移除所有类型event的执行函数removeListener(type,callBack){if(this._events[type]){this._events[type]=this._events[type].filter(fn=>{returncallBack!=fn&&fn.cb!=callBack})}}//移除所有事件removeAllListeners(){this._events=Object.create(null)}//get当前实例的最大事件绑定限制getMaxListeners(){returnthis._count?this._count:EventEmitter.defaultMaxListeners;}//设置当前实例的最大事件绑定限制setMaxListeners(n){this._count=n;}}//设置默认最大事件绑定限制EventEmitter.defaultMaxListeners=10;module.exports=EventEmitter;
