JS实现 Event Bus

本文详细介绍了如何使用ES6的class关键字初始化Event,并通过Map数据结构存储事件和监听者,实现了事件监听、触发和移除功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

利用ES6的class关键字对Event进行初始化,包括Event的事件清单和监听者上限.

选择Map作为储存事件的结构,因为作为键值对的储存方式Map比一般对象更加适合,操作起来也更加简洁

class EventBus {
    constructor () {
        this._events = this._events || new Map(); // 存储事件/回调键值对
        this._maxListeners = this._maxListeners || 10; // 设立监听上限
    }

    // $on 监听    
    on(type,fn) {
        const handler = this._events.get(type); // 获取对应事件名称的函数清单
        if (!handler) {
            this._events.set(type, fn);
        } else if (handler && typeof handler === 'function') {
            // 如果handler是函数,说明当前只有一个监听者
            // 再次添加监听者,需要改用 数组储存
            this._events.set(type,[handler,fn]);
        } else {
            // 已有多个监听者,直接往数组里push函数即可
            handler.push(fn);
        }
    }

    // $emit 触发
    emit(type, ...args) {
        let handler = this._events.get(type);

        if (Array.isArray(handler)) {
            // 是数组,说明有多个监听者,需要依次触发里边的函数
            for (let i=0;i<handler.length;++i) {
                if (args.length > 0) {
                    handler[i].apply(this,args);
                } else {
                    handler[i].call(this);
                }
            }
        } else {
            // 单个函数的情况直接触发即可
            if (args.length > 0) {
                handler.apply(this,args);
            } else {
                handler.call(this);
            }
        }

        return true
    }

    // $off 移除监听 (此处跟原文相比略有改动)
    off(type,fn) {
        const handler = this._events.get(type);

        if (handler && typeof handler === 'function') {
            // 函数,说明只有一个监听者,直接删除就行
            this._events.delete(type,fn)
        } else {
            handler.splice(handler.findIndex(e => e === fn), 1);
        }
    }
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

前端卡卡西呀

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值