当前位置:首页 > 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实现拖拽

实现拖拽的基本步骤 通过监听鼠标事件(mousedown、mousemove、mouseup)实现拖拽功能。以下是核心代码逻辑: const draggableElement = document.…

jquery.js

jquery.js

jQuery 是一个快速、简洁的 JavaScript 库,简化了 HTML 文档遍历、事件处理、动画设计和 Ajax 交互等操作。以下是关于 jQuery.js 的核心信息和使用方法: 获取…

js 实现vue

js 实现vue

Vue.js 的基本实现 在 JavaScript 中实现 Vue.js 的核心功能,可以通过数据绑定、响应式系统和虚拟 DOM 来实现。以下是实现 Vue.js 核心功能的简化版本。 数据响应式系…

js实现复制到剪贴板

js实现复制到剪贴板

使用document.execCommand方法(传统方式,已废弃但部分浏览器仍支持) 该方法适用于旧版浏览器,但已被标记为废弃。执行前需确保文本已被选中: function copyToClip…

js实现pdf在线预览

js实现pdf在线预览

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

js实现拷贝

js实现拷贝

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