Skip to content

手写event类

js
class EventEmitter {
  constructor() {
    this.event = new Map()
  }

  on(eventName, callback) {
    let callbacks = this.event.get(eventName)
    if (!callbacks)
      this.event.set(eventName, callbacks = new Set())

    callbacks.add(callback)
  }

  emit(eventName, ...args) {
    const callbacks = this.event.get(eventName)
    if (!callbacks)
      return

    callbacks.forEach(cb => cb.apply(this, args))
  }

  off(eventName, callback) {
    const callbacks = this.event.get(eventName)
    if (!callbacks)
      return

    if (!callback)
      callbacks.clear()
    else
      callbacks.delete(callback)
  }

  once(eventName, callback) {
    const wrapper = (...args) => {
      callback.apply(this, args)
      this.off(eventName, wrapper)
    }
    this.on(eventName, wrapper)
  }
}
class EventEmitter {
  constructor() {
    this.event = new Map()
  }

  on(eventName, callback) {
    let callbacks = this.event.get(eventName)
    if (!callbacks)
      this.event.set(eventName, callbacks = new Set())

    callbacks.add(callback)
  }

  emit(eventName, ...args) {
    const callbacks = this.event.get(eventName)
    if (!callbacks)
      return

    callbacks.forEach(cb => cb.apply(this, args))
  }

  off(eventName, callback) {
    const callbacks = this.event.get(eventName)
    if (!callbacks)
      return

    if (!callback)
      callbacks.clear()
    else
      callbacks.delete(callback)
  }

  once(eventName, callback) {
    const wrapper = (...args) => {
      callback.apply(this, args)
      this.off(eventName, wrapper)
    }
    this.on(eventName, wrapper)
  }
}