当前位置:首页 > JavaScript

js实现eventemitter

2026-04-05 21:12:32JavaScript

实现 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 方法添加只执行一次的事件监听器:

js实现eventemitter

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实现验证

验证表单输入 使用JavaScript验证表单输入是常见的需求。可以通过监听表单提交事件,检查输入字段是否符合要求。 document.getElementById('myForm').addEve…

js实现拷贝

js实现拷贝

实现文本拷贝 使用 document.execCommand 方法(已废弃但兼容性较好): function copyText(text) { const textarea = document…

js实现换肤

js实现换肤

使用CSS变量实现换肤 通过CSS变量可以轻松实现主题切换功能。CSS变量在根元素中定义,通过JavaScript动态修改这些变量值。 :root { --primary-color: #349…

js实现预览

js实现预览

文件上传预览实现 使用JavaScript实现文件上传预览功能,可以通过FileReader对象读取文件内容并显示预览。以下代码支持图片、文本和PDF文件的预览: // HTML部分需要包含…

js实现百叶窗

js实现百叶窗

使用CSS和JavaScript实现百叶窗效果 通过CSS动画和JavaScript事件监听可以实现百叶窗效果。核心思路是将内容区域分割为多个条状元素,通过控制它们的展开/折叠状态来模拟百叶窗。 &…

vue实现js休眠

vue实现js休眠

实现 JavaScript 休眠的方法 在 Vue 中实现 JavaScript 休眠(延迟执行)可以通过以下方式实现。由于 JavaScript 本身没有内置的 sleep 函数,通常使用 Prom…