实现一个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事件,因为已经移除了

  

最新文章

  1. 【代码笔记】iOS-UITextField设置placeholder颜色
  2. Sublime 常用插件简介
  3. spring-boot启动信息中non-fatal error
  4. 几种方法实现ajax请求内容时使用浏览器后退和前进功能
  5. 练习1-16:修改打印最长文本行的程序的主程序main,使之可以打印任意长度的输入行的长度,并尽可能多地打印文本(C程序设计语言 第2版)
  6. Android开发学习之路-回调实现Service向activity传递数据
  7. Android线程之主线程向子线程发送消息
  8. JSOM 中对各种字段操作
  9. [Java] - 格式字符串替换方法
  10. 遇到的check the manual that corresponds to your MySQL server version for the right syntax错误
  11. LightOJ1157 LCS Revisited(DP)
  12. GC 基础
  13. DataReader方式 获取数据的操作
  14. Django 学习笔记之五 Django中数据库中ManyToManyField及ForeignKey
  15. Apache服务器部署多个进程
  16. 栈的链式存储 - API实现
  17. jquery Tab默认情况下自动切换
  18. Lake Counting (POJ No.2386)
  19. java中log4j的使用体验
  20. C#获取千分位,给数字加逗号分隔符

热门文章

  1. tomcat在cmd中部署到系统服务
  2. 2018-8-10-win10-uwp-横向-AppBarButton
  3. shell 中cut
  4. Linux xargs 命令
  5. ECUST_Algorithm_2019_3
  6. 如何在html中添加引用公共模块文件
  7. imp需要
  8. vue之slot用法
  9. Mac Office2016 安装及破解
  10. 92、R语言分析案例