classEventEmitter{constructor(){// 初始值为空对象this.listeners=Object.create(null)}// 注册事件on=(event,listener)=>{// this.bindEvent(event, listener, false)if(!event||!listener){return}if(this.listeners[event]){//如果有就放一个新的this.listeners[event].push(listener)}else{//如果没有就创建一个数组this.listeners[event]=[listener]}}// 只订阅一次once=(event,listener)=>{// this.bindEvent(event, listener, true)functionone(){// 在one函数运行原来的函数,只有将one清空listener.apply(this,arguments)// 先绑定 执行后再删除this.off(event)}this.on(event,one)//此时emit触发会执行此函数,会给这个函数传递rest参数}// 发布事件emit=(event, ...args)=>{if(!this.hasBind(event)){console.warn(`this event: ${event} don't has bind listener.`)return}this.listeners[event].forEach(listener=>listener.call(this, ...args))}// 取消订阅off=(event,listener)=>{if(!this.hasBind(event)){console.warn(`this event: ${event} don't exist.`)return}// remove all listenerif(!listener){deletethis.listeners[event]return}// remove specific listenerthis.listeners[event]=this.listeners[event].filter(item=>item!==listener)}hasBind=event=>{returnthis.listeners[event]&&this.listeners[event].length}}// 测试constbaseEvent=newEventEmitter()functioncb(value){console.log("hello "+value)}baseEvent.once("click",cb)// baseEvent.off("click")baseEvent.emit("click",'2020')// hello 2020console.log(baseEvent.listeners)