es6实现vue事件触发器

244 阅读1分钟
class EventEmitter {
  constructor() {
    this.events = {}
  }

  _getEventListByName(eventName) {
    if (typeof this.events[eventName] === 'undefined') {
      this.events[eventName] = new Set()
    }
    return this.events[eventName]
  }

  on(eventName, fn) {
    this._getEventListByName(eventName).add(fn)
  }

  once(eventName, fn) {
    const self = this
    const onceFn = function(...args) {
      self.removeListener(eventName, onceFn)
      fn.apply(self, args)
    }
    this.on(eventName, onceFn)
  }

  emit(eventName, ...args) {
    this._getEventListByName(eventName).forEach(function(fn) {
      fn.apply(this, args)
    }.bind(this))
  }

  removeListener(eventName, fn) {
    this._getEventListByName(eventName).delete(fn)
  }
}

export default EventEmitter