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

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

js 实现分页

js 实现分页

实现分页的基本逻辑 分页功能通常需要后端返回数据总量或总页数,前端根据当前页码和每页条数截取对应数据。以下是一个基于JavaScript的简单分页实现方案: 前端分页实现 假设已有从后端获取的完整数…

js实现vue路由

js实现vue路由

Vue 路由的基本实现 在 Vue.js 中实现路由功能通常使用 Vue Router 库。Vue Router 是 Vue.js 官方的路由管理器,用于构建单页面应用(SPA)。 安装 Vue R…

js实现导航菜单

js实现导航菜单

使用HTML和CSS创建基础结构 导航菜单的基础结构通常由HTML的无序列表(<ul>)和列表项(<li>)组成,每个列表项包含一个链接(<a>)。CSS用于样式化…

js实现复制功能实现

js实现复制功能实现

使用document.execCommand方法(传统方式,已逐渐被弃用) 传统方式通过document.execCommand('copy')实现复制功能,需先选中文本。以下是一个完整示例: fu…

js 实现超链接

js 实现超链接

使用 HTML 的 <a> 标签 在 JavaScript 中动态创建超链接可以通过操作 DOM 实现。通过 document.createElement 创建一个 <a> 元…