如何实现一个 EventEmitter?
参考答案:
EventEmitter
是一种设计模式,通常用于在 JavaScript 中实现事件驱动的架构。它允许对象监听特定事件,并在这些事件发生时执行相应的函数。这种设计模式在 Node.js 中被广泛使用,但也可以在浏览器或其他 JavaScript 环境中实现。
以下是一个简单的 EventEmitter
的实现:
class EventEmitter {
constructor() {
this.events = {};
}
// 添加事件监听器
on(eventName, listener) {
if (!this.events[eventName]) {
this.events[eventName] = [];
}
this.events[eventName].push(listener);
}
// 移除事件监听器
off(eventName, listener) {
if (!this.events[eventName]) return;
const index = this.events[eventName].indexOf(listener);
if (index !== -1) {
this.events[eventName].splice(index, 1);
}
}
// 触发事件
emit(eventName, ...args) {
if (!this.events[eventName]) return;
for (const listener of this.events[eventName]) {
listener(...args);
}
}
}
使用方法如下:
const eventEmitter = new EventEmitter();
// 添加事件监听器
eventEmitter.on('myEvent', (arg1, arg2) => {
console.log(`myEvent triggered with args: ${arg1}, ${arg2}`);
});
// 触发事件
eventEmitter.emit('myEvent', 'Hello', 'World');
在这个实现中,EventEmitter
有一个 events
对象,用于存储所有注册的事件及其对应的监听器。on
方法用于添加监听器,off
方法用于移除监听器,emit
方法用于触发事件。
请注意,这个实现非常基础,没有处理一些复杂情况,例如监听器函数的上下文(this
)问题,或者监听器函数的返回值(通常用于表示是否应该停止事件的传播)。在实际应用中,你可能需要根据你的需求对这个实现进行扩展。