当前位置:首页 > JavaScript

js实现emit

2026-02-02 11:06:12JavaScript

实现事件发射器(Event Emitter)的核心逻辑

事件发射器模式是观察者模式的实现,允许对象订阅和触发自定义事件。以下是基于原生JavaScript的实现方式:

基础实现方案

创建EventEmitter类,包含事件注册和触发功能:

js实现emit

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

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

  emit(eventName, ...args) {
    const listeners = this.events[eventName];
    if (listeners) {
      listeners.forEach(listener => listener.apply(this, args));
    }
    return this;
  }

  off(eventName, listenerToRemove) {
    const listeners = this.events[eventName];
    if (listeners) {
      this.events[eventName] = listeners.filter(
        listener => listener !== listenerToRemove
      );
    }
    return this;
  }
}

高级功能扩展

增加一次性事件和错误处理能力:

js实现emit

class AdvancedEventEmitter extends EventEmitter {
  once(eventName, listener) {
    const onceWrapper = (...args) => {
      listener.apply(this, args);
      this.off(eventName, onceWrapper);
    };
    return this.on(eventName, onceWrapper);
  }

  prependListener(eventName, listener) {
    if (!this.events[eventName]) {
      this.events[eventName] = [];
    }
    this.events[eventName].unshift(listener);
    return this;
  }

  removeAllListeners(eventName) {
    delete this.events[eventName];
    return this;
  }
}

实际应用示例

const emitter = new AdvancedEventEmitter();

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

// 一次性监听
emitter.once('connect', () => {
  console.log('Connection established');
});

// 触发事件
emitter.emit('data', { id: 1, value: 'test' });
emitter.emit('connect');
emitter.emit('connect'); // 不会再次触发

性能优化建议

使用WeakMap存储私有事件数据避免内存泄漏:

const privateMap = new WeakMap();

class OptimizedEventEmitter {
  constructor() {
    privateMap.set(this, { events: {} });
  }

  _getEvents() {
    return privateMap.get(this).events;
  }

  on(eventName, listener) {
    const events = this._getEvents();
    events[eventName] = events[eventName] || [];
    events[eventName].push(listener);
    return this;
  }
}

浏览器兼容方案

为支持旧版浏览器提供ES5实现:

function LegacyEventEmitter() {
  this.events = {};
}

LegacyEventEmitter.prototype.on = function(eventName, listener) {
  this.events[eventName] = this.events[eventName] || [];
  this.events[eventName].push(listener);
};

LegacyEventEmitter.prototype.emit = function(eventName) {
  var args = Array.prototype.slice.call(arguments, 1);
  (this.events[eventName] || []).forEach(function(listener) {
    listener.apply(this, args);
  }.bind(this));
};

标签: jsemit
分享给朋友:

相关文章

js轮播图实现原理

js轮播图实现原理

轮播图的基本原理 轮播图通过动态切换显示的内容(图片、文本等)实现视觉上的滑动效果。核心原理是利用CSS和JavaScript控制元素的显示与隐藏,或通过变换位置实现滑动动画。 实现方法一:…

js实现pdf在线预览

js实现pdf在线预览

使用PDF.js实现PDF在线预览 PDF.js是由Mozilla开发的一个开源JavaScript库,可以在网页中直接渲染PDF文件。以下是实现PDF在线预览的步骤: 引入PDF.js库 在HT…

js实现变形

js实现变形

使用 CSS 和 JavaScript 实现元素变形 在 JavaScript 中实现变形效果通常结合 CSS 的 transform 属性,通过动态修改该属性实现元素的旋转、缩放、倾斜或平移。 基…

js树实现

js树实现

树的基本概念 树是一种非线性的数据结构,由节点和边组成。每个节点包含一个值和指向子节点的引用。树的顶部节点称为根节点,没有子节点的节点称为叶节点。 树的实现方式 在JavaScript中,树可以通过…

js实现投球

js实现投球

实现投球动画的基本思路 使用JavaScript和CSS动画结合的方式模拟投球效果。核心是通过改变元素的位置、旋转和缩放属性,配合定时器或CSS过渡实现平滑动画。 创建基础HTML结构 <…

js实现目录

js实现目录

实现目录的基本思路 在JavaScript中实现目录功能通常涉及以下几个核心步骤:解析文档中的标题元素(如h1-h6),动态生成目录结构,并添加交互逻辑(如点击跳转)。以下是具体实现方法: 解析标题…