实现一个简易的EventEmiter

  • 思路梳理

    1. 首先要有一个对象,存储触发事件,大概长下面这个样子
    let handles = {
        event1: [] // 数组里存放的是回调函数
        event2: []
    }
    
    1. 在监听阶段,我们需要把所有的触发事件收集起来
    2. 在触发阶段,则把所有的存在handles里的事件拿出来分别执行
  • 代码实现

    function Event(){
      this.handles = {}
    }
    Event.prototype.on = function(evName, callback){
      if(!this.handles[evName]){
        this.handles[evName] = []
      }
      this.handles[evName].push(callback)
    }
    Event.prototype.emit = function(evName, ...args){
      const handle = this.handles[evName]
      if(handle){
        for(let i=0,len=handle.length;i<len;i++){
          handle[i](...args)
        }
      }
    }
    let event = new Event()
    event.on('step', (...args)=>{console.log(...args)})
    event.emit('step', 10, 'huahua')
    event.emit('step', 20, 'xiaoming')
    
    function Child(){}
    Child.prototype = new Event()
    let child = new Child()
    child.on('step', (...args)=>{console.log(...args)})
    child.emit('step', 30, '二狗子')
    child.emit('step', 90, '法外狂徒张三')