当前位置:首页 > 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
分享给朋友:

相关文章

css3结合js制作

css3结合js制作

CSS3 结合 JavaScript 制作动态效果 CSS3 和 JavaScript 结合可以实现丰富的动态效果,包括动画、交互和响应式设计。以下是几种常见的实现方式: CSS3 动画与 Java…

js 实现继承

js 实现继承

原型链继承 通过让子类的原型对象指向父类的实例来实现继承。子类实例可以访问父类原型上的属性和方法。 function Parent() { this.name = 'parent'; } Par…

js实现 功能

js实现 功能

在 JavaScript 中实现功能通常涉及多个关键步骤,具体取决于功能需求。以下是常见功能的实现方法和示例: 基本功能实现 使用函数封装逻辑是最直接的方式。例如,实现一个计算两数之和的函数: f…

js实现下拉菜单

js实现下拉菜单

使用HTML和CSS创建基础结构 HTML部分需要包含一个触发下拉的按钮和隐藏的下拉菜单内容: <div class="dropdown"> <button class="dr…

js实现滚动

js实现滚动

实现滚动效果的方法 在JavaScript中实现滚动效果可以通过多种方式完成,以下是一些常见的方法: 使用window.scrollTo() window.scrollTo()方法可以将页面滚动到指…

js图片轮播的实现

js图片轮播的实现

基础图片轮播实现 使用HTML、CSS和JavaScript实现一个简单的图片轮播效果。HTML部分定义轮播容器和图片,CSS负责样式和过渡效果,JavaScript处理逻辑。 <div cl…