class EventEmitter {
constructor() {
this.events = {};
}
// 订阅事件
on(event, listener) {
if (!this.events[event]) {
this.events[event] = [];
}
this.events[event].push(listener);
}
// 发布事件
emit(event, ...args) {
if (this.events[event]) {
this.events[event].forEach(listener => {
listener(...args);
});
}
}
// 移除事件监听器
off(event, listener) {
if (this.events[event]) {
this.events[event] = this.events[event].filter(l => l !== listener);
}
}
// 只订阅一次事件
once(event, listener) {
const onceListener = (...args) => {
listener(...args);
this.off(event, onceListener);
};
this.on(event, onceListener);
}
}
// 使用示例
const emitter = new EventEmitter();
// 订阅事件
emitter.on('greet', (name) => {
console.log(`Hello, ${name}!`);
});
// 发布事件
emitter.emit('greet', 'Alice'); // 输出: Hello, Alice!
// 移除事件监听器
const listener = (name) => {
console.log(`Goodbye, ${name}!`);
};
emitter.on('greet', listener);
emitter.off('greet', listener);
// 只订阅一次事件
emitter.once('greet', (name) => {
console.log(`Hi, ${name}!`);
});
emitter.emit('greet', 'Bob'); // 输出: Hi, Bob!
emitter.emit('greet', 'Charlie'); // 不会输出任何内容