实现发布订阅模式
发布订阅模式它和观察者模式类似,区别是:一个有中间商(发布订阅模式)一个没有中间商(观察者模式)
class YFEmmiter{ #handlers={} $on(event,callback){ //1.1添加私有属性 //1.2保存事件 if(this.#handlers[event]===undefind{ this.#handlers[event]=[] } this.#hanlers[event].push(callback) } //2.1接受不定长参数 $emit(event,...args){ //2.2循环触发事件 const funcs=this.#handlers[event]||[] funcs.forEach(callback=>{ callback(...args) }) } $off(event){ this.#handlers[event]=undefind } $once(event,callback){ //4.1调用on注册事件 this.$on(event,(...args)=>{ callback(...args) //4.2事件内调用$off this.$off(event) }) } } const bus=new YFEmmiter() //注册事件 document.querySelector('.on').addEventListener('click',()=>{ bus.$on('event1',()=>{console.log('回调函数1');}) bus.$on('event2',(name,info)=>{console.log(name,info);}) bus.$on('event2',(name,info)=>{console.log('event2的第二个回调函数',name,info);}) }) //触发事件 document.querySelector('.emit').addEventListener('click',()=>{ bus.$emit('event1') bus.$emit('event2','itheima','666') }) //移除事件 document.querySelector('.off').addEventListener('click',()=>{ bus.$off('event2') }) //一次性事件注册 document.querySelector('.once-on').addEventListener('click',()=>{ bus.$once('$once-event',(name,info)=>{ console.log(name,info); }) }) //一次性事件触发 document.querySelector('.once-emit').addEventListener('click',()=>{ bus.$emit('$once-event','itheima','666') })