用双层map实现命名空间隔离的eventbus,第一层以namespace为key,第二层以event type为key存储回调数组;addlistener、emit、off均需传入namespace参数确保隔离性。

用 Map 实现带命名空间隔离的 EventBus,核心在于把“事件类型”和“命名空间”共同作为键来组织监听器,避免不同模块的同名事件互相干扰。关键不是只存 type → [cb],而是存 [namespace, type] → [cb] 或更清晰地分层管理。
命名空间结构设计:双层 Map 嵌套
第一层 Map 以 namespace 为 key,值是另一个 Map;第二层以 event type 为 key,值是回调函数数组。这样天然隔离,互不污染:
-
初始化:
this.namespaces = new Map() - 添加监听器时:先取或创建对应 namespace 的子 Map,再往其中 type 对应的数组 push 回调
- 触发事件时:只查指定 namespace 下的 type,完全不触及其他命名空间
addListener 支持命名空间参数
方法签名改为 addListener(namespace, type, cb),例如:
bus.addListener('user', 'login', handleLogin)bus.addListener('cart', 'add', handleAdd)- 即使两个命名空间都定义了
'update',也不会混用
emit 和 off 同样需传入 namespace
确保行为一致性:
-
emit(namespace, type, payload)—— 只通知该命名空间下注册的 type 监听器 -
off(namespace, type, cb?)—— 不传 cb 则清空该命名空间下该 type 的所有监听;传 cb 则精准移除 - 若想批量清理整个命名空间,可加
clearNamespace(ns)方法,直接 delete 对应子 Map
可选增强:支持通配符或默认命名空间
提升实用性但不破坏隔离性:
- 预留
DEFAULT_NS = '__default__',当调用addListener(type, cb)无 namespace 时自动归入,默认空间仍与其他空间物理隔离 - 允许
addListener('user', '*', cb)监听 user 下所有事件(需在内部判断 type === '*' 并单独维护 wildcard 列表) - 注意:通配监听不改变命名空间边界,
'admin' + '*'依然不会收到'user'下的任何事件










