当前位置:首页 > JavaScript

js实现emit

2026-04-07 04:38:06JavaScript

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

在 JavaScript 中,可以通过自定义类或对象实现事件发射器(Event Emitter)功能,用于监听和触发事件。以下是两种常见实现方式:

基于类的实现

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('event', (arg1, arg2) => console.log(arg1, arg2));
emitter.emit('event', 'Hello', 'World');

基于对象的实现

const eventEmitter = {
  events: {},
  on(eventName, fn) {
    this.events[eventName] = this.events[eventName] || [];
    this.events[eventName].push(fn);
  },
  off(eventName, fn) {
    if (this.events[eventName]) {
      this.events[eventName] = this.events[eventName].filter(f => f !== fn);
    }
  },
  emit(eventName, ...args) {
    if (this.events[eventName]) {
      this.events[eventName].forEach(fn => fn(...args));
    }
  }
};

使用方法:

eventEmitter.on('test', data => console.log(data));
eventEmitter.emit('test', 'Emitted data');

扩展功能实现

如果需要更完整的事件发射器,可以添加以下功能:

js实现emit

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

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

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

  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);
    }
  }

  listenerCount(eventName) {
    const listeners = this.events[eventName];
    return listeners ? listeners.length : 0;
  }
}

使用场景示例

const emitter = new AdvancedEventEmitter();

// 常规监听
emitter.on('data', data => console.log('Received:', data));

// 一次性监听
emitter.once('connect', () => console.log('Connected!'));

// 触发事件
emitter.emit('data', { id: 1, value: 'test' });
emitter.emit('connect');
emitter.emit('connect'); // 不会触发,因为是一次性监听

注意事项

  • 事件名称可以是任意字符串,但建议使用有意义的命名
  • 移除监听器时需要传入相同的函数引用
  • 大量事件监听可能导致内存问题,需适时清理
  • 生产环境建议使用成熟的库如EventEmitter3

标签: jsemit
分享给朋友:

相关文章

js实现跳转

js实现跳转

使用 window.location 跳转 通过修改 window.location.href 实现页面跳转,这是最常用的方法。 window.location.href = 'https://…

js实现瀑布流

js实现瀑布流

实现瀑布流布局 瀑布流布局是一种常见的网页布局方式,常用于图片展示、商品列表等场景。以下是使用 JavaScript 实现瀑布流布局的几种方法。 纯 JavaScript 实现 通过计算元素的位置和…

js手势实现

js手势实现

手势识别实现方法 在JavaScript中实现手势识别通常涉及监听触摸事件(touchstart、touchmove、touchend)或鼠标事件(mousedown、mousemove、mouseu…

使用js实现

使用js实现

使用JavaScript实现 JavaScript可以通过Math.random()函数生成随机数,结合其他方法可以实现多种随机数生成需求。 // 生成0到1之间的随机小数 const random…

js实现图

js实现图

JavaScript 实现图的常用方法 在 JavaScript 中,图(Graph)可以通过多种方式实现,常见的包括邻接表(Adjacency List)和邻接矩阵(Adjacency Matrix…

js实现求导

js实现求导

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