JS 手写事件监听?其实是监听器模式

在学习 vue3 的过程中,发现 vue 的 vue.$onvue.$offvue.$once 方法废弃了,ESLint 建议我使用 mitt 代替。vue 说这是个侦听器(程序化的事件侦听器),可我想为什么不用 addEventListener() 呢,还要去找这个API(mitt),它们有什么区别?
我隐隐觉得 vue 说的侦听器可能和常用的 addEventListener 不是一个东西,便去找了下资料。找到了这篇博客:java监听器的原理与实现


焕然大悟,原来这里 vue.$on 等实现的监听器,其实是监听器模式(观察者模式、订阅模式)。
我操起键盘,也撸了个出来:

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

// 重写原型,定义 on emit off all 方法
Mitt.prototype = {
  on: function(eventName, eventFunc) {
    this.events.set(eventName,eventFunc)
  },
  // emit 触发的事件可能有多个参数?使用拓展操作符?
  emit: function(eventName, eventParam1) {
    this.events.get(eventName)(eventParam1)
  },
  off: function(eventName) {
    this.events.delete(eventName);
  },
  all: function() {
    return this.events
  }
}

// 恢复原型的 constructor 属性
Object.defineProperty(Mitt.prototype, 'constructor', {
  enumerable: false,
  value: Mitt
})

之后,我又上 mitt 上看了下它是怎么写的,人家还是有一些高明的地方的,不亏这么多 star ,大家也可以去看看。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。