跳到主要内容

如何实现一个 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)问题,或者监听器函数的返回值(通常用于表示是否应该停止事件的传播)。在实际应用中,你可能需要根据你的需求对这个实现进行扩展。