gpt4 book ai didi

前端手写(二十一)——手写event模块

转载 作者:知者 更新时间:2024-03-13 03:01:06 24 4
gpt4 key购买 nike

一、写在前面
手写event模块,我们需要手写一些方法,比如说:addEventListener,removeListener,onceremoveAllListener,emit
二、手写

function EventEmitter() {
  this.events = new Map()
}

//需要封装的方法addListener, removeListener, once, removeAllListener, emit
const wrapFunc = function (fn, once = false) {
  return {
    callback: fn,
    once
  }
}

EventEmitter.prototype.addListener = function (type, fn, once = false) {
  const handler = this.events.get(type)
  if (!handler) {
    this.events.set(type, [wrapFunc(fn, once)])
  } else {
    handler.push(wrapFunc(fn, once))
  }
}

EventEmitter.prototype.removeListener = function (type, fn) {
  const handler = this.events.get(type)
  if (!handler) return
  for (let i = 0; i < handler.length; i++) {
    if (handler[i].callback === fn) {
      handler.splice(i, 1)
      i--
    }
  }
  if (handler.length === 0) {
    this.events.delete(type)
  }
}

EventEmitter.prototype.once = function (type, fn) {
  this.addEventListener(type, fn, true)
}

EventEmitter.prototype.emit = function (type, ...args) {
  const handler = this.events.get(type)
  if (!handler) return
  for (let item of handler) {
    item.callback.apply(this, args)
    this.removeListener(type, item.callback)
  }
}

EventEmitter.prototype.removeAllListener = function (type) {
  this.events.delete(type)
}

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com