实现一个EventEmitter类,这个类包含以下方法: on/ once/fire/off
2024-09-03 04:36:25
实现一个EventEmitter类,这个类包含以下方法: on(监听事件,该事件可以被触发多次)- once(也是监听事件,但只能被触发一次)- fire(触发指定的事件)- off(移除指定事件的某个回调方法或者所有回调方法)
function EventEmitter() {
this.handlers = {}
}
//监听事件,该事件可以被触发多次
EventEmitter.prototype.on = function (eventName, handle) {
if (!this.handlers.hasOwnProperty(eventName)) {
this.handlers[eventName] = []
}
this.handlers[eventName].push(handle)
}
//也是监听事件,但只能被触发一次
EventEmitter.prototype.once = function (eventName, handle) { }
//触发指定的事件
EventEmitter.prototype.fire = function (eventName, ...params) {
if (!this.handlers.hasOwnProperty(eventName)) return
//事件队列依次执行
this.handlers[eventName].map(handle => {
handle(...params)
})
}
//移除指定事件的某个回调方法或者所有回调方法
EventEmitter.prototype.off = function (eventName, handle) {
if (!this.handlers.hasOwnProperty(eventName)) return
//获取下标,并删除
let index = this.handlers[eventName].indexOf(handle)
this.handlers[eventName].splice(index, 1)
} const emitter = new EventEmitter();
emitter.on('drink', (person) => {
console.log(person + '喝水')
})
emitter.on('eat', (person) => {
console.log(person + '吃东西')
})
// event.once('buy', (person) => {
// console.log(person + '买东西')
// })
emitter.fire('drink', '我') // 我喝水
emitter.fire('drink', '我') // 我喝水
emitter.fire('eat', '其它人') // 其它人吃东西
emitter.fire('eat', '其它人') // 其它人吃东西
emitter.fire('buy', '其它人') //其它人买东西
emitter.fire('buy', '其它人') //这里不会再次触发buy事件,因为once只能触发一次
emitter.off('eat') //移除eat事件
emitter.fire('eat', '其它人') //这里不会触发eat事件,因为已经移除了
最新文章
- 【代码笔记】iOS-UITextField设置placeholder颜色
- Sublime 常用插件简介
- spring-boot启动信息中non-fatal error
- 几种方法实现ajax请求内容时使用浏览器后退和前进功能
- 练习1-16:修改打印最长文本行的程序的主程序main,使之可以打印任意长度的输入行的长度,并尽可能多地打印文本(C程序设计语言 第2版)
- Android开发学习之路-回调实现Service向activity传递数据
- Android线程之主线程向子线程发送消息
- JSOM 中对各种字段操作
- [Java] - 格式字符串替换方法
- 遇到的check the manual that corresponds to your MySQL server version for the right syntax错误
- LightOJ1157 LCS Revisited(DP)
- GC 基础
- DataReader方式 获取数据的操作
- Django 学习笔记之五 Django中数据库中ManyToManyField及ForeignKey
- Apache服务器部署多个进程
- 栈的链式存储 - API实现
- jquery Tab默认情况下自动切换
- Lake Counting (POJ No.2386)
- java中log4j的使用体验
- C#获取千分位,给数字加逗号分隔符