实现一个EventEmitter类,这个类包含以下方法: on(监听事件,该事件可以被触发多次)- once(也是监听事件,但只能被触发一次)- fire(触发指定的事件)- off(移除指定事件的某个回调方法或者所有回调方法)
  1. function EventEmitter() {
  2. this.handlers = {}
  3. }
  4. //监听事件,该事件可以被触发多次
  5. EventEmitter.prototype.on = function (eventName, handle) {
  6. if (!this.handlers.hasOwnProperty(eventName)) {
  7. this.handlers[eventName] = []
  8. }
  9. this.handlers[eventName].push(handle)
  10. }
  11. //也是监听事件,但只能被触发一次
  12. EventEmitter.prototype.once = function (eventName, handle) {
  13.  
  14. }
  15. //触发指定的事件
  16. EventEmitter.prototype.fire = function (eventName, ...params) {
  17. if (!this.handlers.hasOwnProperty(eventName)) return
  18. //事件队列依次执行
  19. this.handlers[eventName].map(handle => {
  20. handle(...params)
  21. })
  22. }
  23. //移除指定事件的某个回调方法或者所有回调方法
  24. EventEmitter.prototype.off = function (eventName, handle) {
  25. if (!this.handlers.hasOwnProperty(eventName)) return
  26. //获取下标,并删除
  27. let index = this.handlers[eventName].indexOf(handle)
  28. this.handlers[eventName].splice(index, 1)
  29. }
  30.  
  31. const emitter = new EventEmitter();
  32. emitter.on('drink', (person) => {
  33. console.log(person + '喝水')
  34. })
  35. emitter.on('eat', (person) => {
  36. console.log(person + '吃东西')
  37. })
  38. // event.once('buy', (person) => {
  39. // console.log(person + '买东西')
  40. // })
  41. emitter.fire('drink', '我') // 我喝水
  42. emitter.fire('drink', '我') // 我喝水
  43. emitter.fire('eat', '其它人') // 其它人吃东西
  44. emitter.fire('eat', '其它人') // 其它人吃东西
  45. emitter.fire('buy', '其它人') //其它人买东西
  46. emitter.fire('buy', '其它人') //这里不会再次触发buy事件,因为once只能触发一次
  47. emitter.off('eat') //移除eat事件
  48. emitter.fire('eat', '其它人') //这里不会触发eat事件,因为已经移除了

  

实现一个EventEmitter类,这个类包含以下方法: on/ once/fire/off的更多相关文章

  1. “每日一道面试题”.Net中所有类的基类是以及包含的方法

    闲来无事,每日一贴.水平有限,大牛勿喷. .Net中所有内建类型的基类是System.Object毋庸置疑 Puclic Class A{}和 Public Class A:System.Object ...

  2. python练习题-写一个函数,打印所有包含copy方法的内置对象

    代码: #encoding=utf-8for i in dir(__builtins__):    #print "i:",i    try: #这里的i是个字符串,并不能直接用d ...

  3. C#类、接口、虚方法和抽象方法0322

    虚拟方法和抽象方法有什么区别与联系: 1.抽象方法只有声明没有实现代码,需要在子类中实现:虚拟方法有声明和实现代码,并且可以在子类中重写,也可以不重写使用父类的默认实现. 2.抽象类不能被实例化(不可 ...

  4. Java基础-继承-编写一个Java应用程序,设计一个汽车类Vehicle,包含的属性有车轮个数 wheels和车重weight。小车类Car是Vehicle的子类,其中包含的属性有载人数 loader。卡车类Truck是Car类的子类,其中包含的属性有载重量payload。每个 类都有构造方法和输出相关数据的方法。最后,写一个测试类来测试这些类的功 能。

    #29.编写一个Java应用程序,设计一个汽车类Vehicle,包含的属性有车轮个数 wheels和车重weight.小车类Car是Vehicle的子类,其中包含的属性有载人数 loader.卡车类T ...

  5. 编写一个类,其中包含一个排序的方法Sort(),当传入的是一串整数,就按照从小到大的顺序输出,如果传入的是一个字符串,就将字符串反序输出。

    namespace test2 { class Program { /// <summary> /// 编写一个类,其中包含一个排序的方法Sort(),当传入的是一串整数,就按照从小到大的 ...

  6. 定义一个复数(z=x+iy)类Complex,包含: 两个属性:实部x和虚部y 默认构造函数 Complex(),设置x=0,y=0 构造函数:Complex(int i,int j) 显示复数的方法:showComp()将其显示为如: 5+8i或5-8i 的形式。 求两个复数的和的方法:(参数是两个复数类对象,返回值是复数类对象)public Complex addComp(Compl

    因标题框有限,题目未显示完整,以下再放一份: 定义一个复数(z=x+iy)类Complex,包含: 两个属性:实部x和虚部y 默认构造函数 Complex(),设置x=0,y=0 构造函数:Compl ...

  7. 一个完整的PHP类包含的七种语法说明

    类中的七种语法说明 -属性 -静态属性 -方法 -静态方法 -类常量 -构造函数 -析构函数 <?php class Student { // 类里的属性.方法和函数的访问权限有 (函数和方法是 ...

  8. Hibernate的多表查询,分装到一个新的实体类中的一个方法

    不知道是否还有其他方法实现,请高人指点. 如果涉及到多张表多字段查询,并且想利用查询出来的字段在界面层构建一个新的实体类,可以使用这种方法: 如果查询出来的多字段中,有多个字段的名字都相同(如想查询出 ...

  9. Cygwin 是一个用于 Windows 的类 UNIX shell 环境

    cygwin的安装使用   Cygwin 是一个用于 Windows 的类 UNIX shell 环境. 它由两个组件组成:一个 UNIX API 库,它模拟 UNIX 操作系统提供的许多特性:以及 ...

随机推荐

  1. Android中Parcelable的原理和使用方法

    Parcelable的简单介绍 介绍Parcelable不得不先提一下Serializable接口,Serializable是Java为我们提供的一个标准化的序列化接口,那什么是序列化呢? 进行And ...

  2. Sql 将A表数据插入到B表

    A表和B表字段不同 --insert into B(Name,PersonalId,Education,IsDel) select Name, PersonId as PersonalId, ( ca ...

  3. SetDefaultDllDirectories问题

    换台电脑编译报错! 在使用Visual Studio 2013编译程序的时候报以下错误 vc\atlmfc\include\atlcore.h(638): error C2039: “”: 不是“`g ...

  4. laravel5.6 基于redis,使用消息队列(邮件推送)

    邮件发送如何配置参考:https://www.cnblogs.com/clubs/p/10640682.html 用到的用户表: CREATE TABLE `recruit_users` ( `id` ...

  5. PID算法知识点博文收藏记录

    https://blog.csdn.net/Uncle_GUO/article/details/51367764 https://blog.csdn.net/HandsomeHong/article/ ...

  6. setattr(object, name, value)¶

    This is the counterpart of getattr(). The arguments are an object, a string and an arbitrary value. ...

  7. JMS Activemq实战例子demo

    上一篇已经讲了JMS的基本概念,这一篇来上手练一练,如果对JMS基本概念还不熟悉,欢迎参靠JMS基本概. 这篇文章所使用的代码已经不是我刚入手时的代码,已经经过我重构过的代码,便于理解,并且加了很多中 ...

  8. spring boot2.x集成spring security5与druid1.1.13(一)

    版本:         spring boot 2.1.2.RELEASE         druid-spring-boot-starter 1.1.13 步骤:        一.maven    ...

  9. Ubuntu下Arm-Linux-GCC交叉编译环境的搭建

    1.下载arm-linux-gcc-3.4.1.tar.bz2到临时的目录下. 2.解压 arm-linux-gcc-3.4.1.tar.bz2 #tar -jxvf arm-linux-gcc-3. ...

  10. %各位大佬的博客.tql

    线性基:https://www.cnblogs.com/ljh2000-jump/p/5869991.html#4219854 数位DP  https://blog.csdn.net/jk211766 ...