当前位置:首页 > JavaScript

js实现eventemitter

2026-04-05 21:12:32JavaScript

实现 EventEmitter 的基本结构

EventEmitter 是 Node.js 中的核心模块,用于处理事件。以下是一个简单的 JavaScript 实现:

class EventEmitter {
  constructor() {
    this.events = {};
  }
}

添加事件监听

使用 on 方法添加事件监听器:

js实现eventemitter

on(eventName, listener) {
  if (!this.events[eventName]) {
    this.events[eventName] = [];
  }
  this.events[eventName].push(listener);
}

触发事件

使用 emit 方法触发事件:

js实现eventemitter

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 方法
  • 未实现错误事件处理

性能优化建议

  • 对于高频触发的事件,可以考虑使用更高效的数据结构
  • 可以考虑添加事件触发频率限制
  • 可以添加事件优先级支持

标签: jseventemitter
分享给朋友:

相关文章

js实现分页

js实现分页

实现分页的基本思路 分页功能通常需要处理数据分割、页码生成和用户交互。核心逻辑包括计算总页数、根据当前页截取数据、渲染页码按钮等。 前端分页实现(静态数据) 假设已有全部数据,仅需前端分页展示:…

js实现vr

js实现vr

使用WebXR API实现VR体验 WebXR是浏览器中实现VR和AR体验的标准API,它取代了早期的WebVR。现代浏览器如Chrome、Edge和Firefox已支持WebXR。 // 初始化W…

js类实现

js类实现

使用类实现 JavaScript 功能 在 JavaScript 中,类(Class)是一种语法糖,基于原型继承机制。通过 class 关键字可以更直观地定义对象模板。 基本类定义 class…

js实现求导

js实现求导

实现数值求导的方法 在JavaScript中实现求导通常采用数值方法,因为JavaScript不是符号计算语言。以下是常见的数值微分方法: 中心差分法 中心差分法提供较高精度的导数近似:…

js树实现

js树实现

树的基本概念 树是一种非线性的数据结构,由节点和边组成。每个节点包含一个值和指向子节点的引用。树的顶部节点称为根节点,没有子节点的节点称为叶节点。 树的实现方式 在JavaScript中,树可以通过…

js图片上传实现

js图片上传实现

图片上传的基本实现 使用HTML的<input type="file">元素配合JavaScript的File API实现基础图片上传功能。HTML部分需要设置accept="image/…