当前位置:首页 > JavaScript

js实现emit

2026-04-07 04:38:06JavaScript

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

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

js实现emit

基于类的实现

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

使用方法:

js实现emit

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

扩展功能实现

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

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实现文件下载

使用 a 标签下载文件 通过动态创建 a 标签并设置 download 属性实现文件下载。适用于已知文件 URL 或 Blob 数据的情况。 function downloadFile(url, f…

js实现拷贝

js实现拷贝

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

js手势实现

js手势实现

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

利用js实现

利用js实现

使用 JavaScript 实现 在 JavaScript 中,可以通过多种方式实现功能,具体取决于需求。以下是几种常见的方法: 方法一:使用原生 JavaScript // 示例代码…

js实现正交

js实现正交

正交的概念 正交在数学和计算机科学中通常指两个向量垂直或线性无关。在编程中,正交性常被用于设计模块化、低耦合的系统。 向量正交判断 判断两个向量是否正交可以通过点积是否为0来实现: fun…

js实现下拉刷新

js实现下拉刷新

监听触摸事件 通过监听 touchstart、touchmove 和 touchend 事件来检测用户下拉手势。记录触摸起始位置和移动距离。 let startY = 0; let currentY…