当前位置:首页 > JavaScript

js实现emit

2026-03-15 11:07:50JavaScript

实现事件发射器(Event Emitter)的 JavaScript 方法

在 JavaScript 中实现事件发射器(emit)的核心是管理事件监听器(listeners)并触发事件。以下是两种常见实现方式:

基于类的 EventEmitter 实现

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

  // 注册事件监听器
  on(eventName, listener) {
    if (!this.events[eventName]) {
      this.events[eventName] = [];
    }
    this.events[eventName].push(listener);
  }

  // 触发事件
  emit(eventName, ...args) {
    const listeners = this.events[eventName];
    if (listeners) {
      listeners.forEach(listener => listener(...args));
    }
  }

  // 移除事件监听器
  off(eventName, listenerToRemove) {
    const listeners = this.events[eventName];
    if (listeners) {
      this.events[eventName] = listeners.filter(
        listener => listener !== listenerToRemove
      );
    }
  }
}

使用示例:

const emitter = new EventEmitter();
emitter.on('click', (x, y) => console.log(`Clicked at ${x}, ${y}`));
emitter.emit('click', 100, 200); // 输出: Clicked at 100, 200

基于对象的简化实现

如果不需要完整的类实现,可以使用纯对象:

const createEmitter = () => {
  const events = {};
  return {
    on: (eventName, listener) => {
      events[eventName] = events[eventName] || [];
      events[eventName].push(listener);
    },
    emit: (eventName, ...args) => {
      (events[eventName] || []).forEach(listener => listener(...args));
    }
  };
};

// 使用
const emitter = createEmitter();
emitter.on('log', message => console.log(message));
emitter.emit('log', 'Hello World'); // 输出: Hello World

支持一次性监听器(once)

扩展上述实现以支持只触发一次的监听器:

js实现emit

class EventEmitter {
  // ...其他方法同前...

  once(eventName, listener) {
    const onceWrapper = (...args) => {
      listener(...args);
      this.off(eventName, onceWrapper);
    };
    this.on(eventName, onceWrapper);
  }
}

注意事项

  1. 错误处理:实际使用时可添加 try-catch 包裹 listener(...args) 调用。
  2. 异步触发:若需异步执行监听器,可用 setTimeoutPromise 包装。
  3. 浏览器环境:现代浏览器可直接使用 EventTarget API(如 addEventListener)。

以上实现覆盖了事件发射器的核心功能,可根据实际需求扩展。

标签: jsemit
分享给朋友:

相关文章

js实现分页

js实现分页

分页的基本实现思路 在JavaScript中实现分页功能通常需要结合前端和后端逻辑。前端负责渲染分页控件和处理用户交互,后端负责提供分页数据。 前端分页实现 纯前端分页适用于数据量较小的情况,可以直…

js实现复制功能

js实现复制功能

使用 document.execCommand 方法 这种方法适用于较旧的浏览器,但在现代浏览器中可能被逐步淘汰。通过创建一个临时的 textarea 元素,将文本内容放入其中,然后执行复制命令。…

js实现换肤

js实现换肤

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

js类实现

js类实现

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

js实现自举

js实现自举

实现 JavaScript 自举的方法 JavaScript 自举(Bootstrap)通常指通过 JavaScript 动态加载自身或依赖的脚本,实现运行时环境的初始化或扩展。以下是几种常见实现方式…

js画图实现

js画图实现

使用Canvas API绘制图形 Canvas是HTML5提供的绘图API,通过JavaScript操作Canvas元素可以绘制各种图形。以下是一个简单的示例: <canvas id="myC…