美文网首页
实现简易版的EventEmit

实现简易版的EventEmit

作者: jluemmmm | 来源:发表于2020-08-12 07:03 被阅读0次

class EventEmit {
    /**
     * 类中的constructor方法就是构造方法,通过new命令生成对象实例,所有实例都共享这个方法
     * this关键字代表实例对象,定义在this上的属性是实例属性,否则是定义在原型对象上的属性
     */

    constructor() {
        this.listeners = {}
    }

    /**
     * 自定义事件绑定
     * @param {String} eventName
     * @param {Function} handler
     * @param {Boolean} [one]
     * 
     * 指定事件注册一个监听器,接受一个字符串 event / 一个回调函数 / 一个布尔值
     */

     on(eventName, handler, one) {
         let event = this.listeners[eventName] = []
         //如果该eventName不存在,则将该handler转换为数组
         if(!event) {
            this.listeners[eventName] = [handler]
         } 
         event.push(handler)
         if(one) {
             event.once = true
         }
     }

     /**
      * 是否有事件
      * @param {String} name
      */
     has(name) {
         return this.listeners[name]
     }

     /**
      * 事件只执行一次
      * @param {String} name
      * @param {Function} fn
      */
     once(name, fn) {
         this.on(name, fn, true)
     }

     /**
      * 触发事件
      * @param {String} name
      */
     emit(name, ...args) {
         const ls = this.listeners[name]

         if(!ls) {
             return
         }

         for(let i = 0, i = ls.length; i < 1; i++) {
             ls[i].apply(this, args)
         }

         if(ls.once) {
             delete this.listeners[name]
         }
     }

     /**
      * 关闭指定的自定义事件
      * @param name
      */
     off(name) {
         delete this.listeners[name]
     }

     /**
      * 关闭所有的自定义事件
      */
     offAll() {
         this.listeners = {}
     }
}

EventEmit.instance = new EventEmit()

export default EventEmit

使用

import EventEmit from 'xxx'
//使用统一实例
let em  = Eventmit.instance
//单独创建一个实例
let en = new EventEmit()

EventEmit.instance.on('事件名', callback)
EventEmit.instance.off('事件名‘, ...args)//使用方法

相关文章

网友评论

      本文标题:实现简易版的EventEmit

      本文链接:https://www.haomeiwen.com/subject/hnaudktx.html