js实现eventemitter
实现 EventEmitter 的基本结构
EventEmitter 是 Node.js 中的核心模块,用于处理事件。以下是一个简单的 JavaScript 实现:
class EventEmitter {
constructor() {
this.events = {};
}
}
添加事件监听
使用 on 方法添加事件监听器:

on(eventName, listener) {
if (!this.events[eventName]) {
this.events[eventName] = [];
}
this.events[eventName].push(listener);
}
触发事件
使用 emit 方法触发事件:

emit(eventName, ...args) {
if (this.events[eventName]) {
this.events[eventName].forEach(listener => {
listener.apply(this, args);
});
}
}
移除事件监听
使用 off 方法移除事件监听器:
off(eventName, listenerToRemove) {
if (this.events[eventName]) {
this.events[eventName] = this.events[eventName].filter(
listener => listener !== listenerToRemove
);
}
}
一次性事件监听
使用 once 方法添加只执行一次的事件监听器:
once(eventName, listener) {
const onceWrapper = (...args) => {
listener.apply(this, args);
this.off(eventName, onceWrapper);
};
this.on(eventName, onceWrapper);
}
完整实现示例
class EventEmitter {
constructor() {
this.events = {};
}
on(eventName, listener) {
if (!this.events[eventName]) {
this.events[eventName] = [];
}
this.events[eventName].push(listener);
}
emit(eventName, ...args) {
if (this.events[eventName]) {
this.events[eventName].forEach(listener => {
listener.apply(this, args);
});
}
}
off(eventName, listenerToRemove) {
if (this.events[eventName]) {
this.events[eventName] = this.events[eventName].filter(
listener => listener !== listenerToRemove
);
}
}
once(eventName, listener) {
const onceWrapper = (...args) => {
listener.apply(this, args);
this.off(eventName, onceWrapper);
};
this.on(eventName, onceWrapper);
}
}
使用示例
const emitter = new EventEmitter();
// 添加常规事件监听
emitter.on('data', (data) => {
console.log('Data received:', data);
});
// 添加一次性事件监听
emitter.once('connect', () => {
console.log('Connected!');
});
// 触发事件
emitter.emit('data', { id: 1 }); // 输出: Data received: { id: 1 }
emitter.emit('connect'); // 输出: Connected!
emitter.emit('connect'); // 无输出,因为是一次性事件
注意事项
- 此实现不支持最大监听数限制
- 未实现
removeAllListeners方法 - 未实现
listenerCount方法 - 未实现错误事件处理
性能优化建议
- 对于高频触发的事件,可以考虑使用更高效的数据结构
- 可以考虑添加事件触发频率限制
- 可以添加事件优先级支持






