js实现eventemitter
实现 EventEmitter 的基本结构
EventEmitter 是 Node.js 的核心模块之一,用于实现事件订阅与发布模式。在 JavaScript 中可以通过类或构造函数实现类似功能。
class EventEmitter {
constructor() {
this.events = {};
}
}
添加事件监听方法
实现 on 方法用于订阅事件,支持多个回调函数。
on(eventName, callback) {
if (!this.events[eventName]) {
this.events[eventName] = [];
}
this.events[eventName].push(callback);
}
触发事件方法
实现 emit 方法用于触发事件,执行所有注册的回调函数。
emit(eventName, ...args) {
const callbacks = this.events[eventName];
if (callbacks) {
callbacks.forEach(callback => {
callback(...args);
});
}
}
移除事件监听
实现 off 方法用于取消事件监听。

off(eventName, callback) {
const callbacks = this.events[eventName];
if (callbacks) {
this.events[eventName] = callbacks.filter(cb => cb !== callback);
}
}
一次性事件监听
实现 once 方法用于只触发一次的事件监听。
once(eventName, callback) {
const wrapper = (...args) => {
callback(...args);
this.off(eventName, wrapper);
};
this.on(eventName, wrapper);
}
完整实现代码
将所有方法组合起来形成完整的 EventEmitter 实现。

class EventEmitter {
constructor() {
this.events = {};
}
on(eventName, callback) {
if (!this.events[eventName]) {
this.events[eventName] = [];
}
this.events[eventName].push(callback);
}
emit(eventName, ...args) {
const callbacks = this.events[eventName];
if (callbacks) {
callbacks.forEach(callback => {
callback(...args);
});
}
}
off(eventName, callback) {
const callbacks = this.events[eventName];
if (callbacks) {
this.events[eventName] = callbacks.filter(cb => cb !== callback);
}
}
once(eventName, callback) {
const wrapper = (...args) => {
callback(...args);
this.off(eventName, wrapper);
};
this.on(eventName, wrapper);
}
}
使用示例
展示如何在实际代码中使用自定义的 EventEmitter。
const emitter = new EventEmitter();
// 添加监听
emitter.on('message', (msg) => {
console.log('收到消息:', msg);
});
// 触发事件
emitter.emit('message', 'Hello World');
// 一次性监听
emitter.once('greet', (name) => {
console.log(`Hello ${name}`);
});
emitter.emit('greet', 'Alice'); // 会触发
emitter.emit('greet', 'Bob'); // 不会触发
// 移除监听
const handler = (data) => console.log('Data:', data);
emitter.on('data', handler);
emitter.off('data', handler);
错误处理增强
为 EventEmitter 添加错误处理机制,避免未处理的错误导致程序崩溃。
emit(eventName, ...args) {
try {
const callbacks = this.events[eventName];
if (callbacks) {
callbacks.forEach(callback => {
callback(...args);
});
}
} catch (error) {
if (eventName !== 'error') {
this.emit('error', error);
}
}
}
最大监听数限制
实现监听器数量的限制,防止内存泄漏。
constructor(maxListeners = 10) {
this.events = {};
this.maxListeners = maxListeners;
}
on(eventName, callback) {
if (!this.events[eventName]) {
this.events[eventName] = [];
}
if (this.events[eventName].length >= this.maxListeners) {
console.warn(`Possible memory leak detected for event "${eventName}"`);
}
this.events[eventName].push(callback);
}






