【设计模式】JavaScript 手写发布订阅

深度解析JavaScript中常见设计模式及其应用场景,看完去面试,面试官说:就你了 深度解析JavaScript中常见设计模式及其应用场景,并手写部分经典模式 阅读详情

核心代码

// 核心:监听、触发、关闭

const PubSub = {
  map: {
    // click:[fn1, fn2] // 对应事件发布队列
  },
  // 监听
  on: (name, fn) => {
    PubSub.map[name] = PubSub.map[name] || []
    PubSub.map[name].push(fn) // 存入队列
  },
  // 触发
  emit: (name, data) => {
    const q = PubSub.map[name]
    if (!q) return
    q.forEach((f) => f.call(undefined, data)) // 触发对应事件队列的所有事件
  },
  // 关闭
  off: (name, fn) => {
    const q = PubSub.map[name]
    if (!q) return
    const index = q.indexOf(fn)
    console.log(index)
    if (index < 0) return
    q.splice(index, 1) // 删除
  },
}

测试用例

function fn1(text) {
  console.log('自定义函数1:', text)
}
function fn2(text) {
  console.log('自定义函数2:', text)
}

// 监听事件
PubSub.on('click', fn1)
PubSub.on('click', fn2)

setTimeout(() => {
  // 触发
  PubSub.emit('click', '我是触发事件的参数1')

  // 关闭
  PubSub.off('click', fn1) // 关闭 fn1 
  PubSub.emit('click', '我是触发事件的参数2')

  console.log(PubSub.map);
}, 1000)

测试结果

image

【javascript基础——系列6】常见的5种JavaScript设计模式;发布订阅者模式 文章目录一、常见的5种JavaScript设计模式1.1 工厂模式1.2 构造函数模式1.3 单例模式1.4 发布订阅者模式1.5 观察者模式 一、常见的5种JavaScript设计模式 工厂模式 构造函数模式 单例模式 发布订阅模式 观察者模式 1.1 工厂模式 工厂模式是创建对象的一种最常用的设计模式,不暴露创建对象的具体逻辑,而是将逻辑封装在一个函数中,那么这个函数就可以被视为一个工厂。 通过对传递参数的预定,返回不同的对象实例,但是这三种实例的内部构造都非常相似,因此还可以对其进行优化。 阅读详情

相关推荐

JavaScript事件发布/订阅模式原理与用法分析

主要介绍了JavaScript事件发布/订阅模式,结合实例形式简单分析了javascript发布/订阅模式的概念、原理及简单使用方法,需要的朋友可以参考下

前端JavaScript之手写实现:发布订阅模式

发布订阅模式:发布订阅模式是软件开发者常见的一种设计模式。该模式中存在一个或多个发布者,一个或多个订阅者,当发布者发布消息时,参与订阅的订阅者就会收到相应的消息通知。

博客简介 883

速腾Helios-16P使用Lego-loam实时构建点云地图(二)——Lego-loam的编译与运行

不兼容的问题,打开lego-loam的~/lego-loam_ws/src/LeGO-LOAM/LeGO-LOAM/src下的4个源码文件,搜索/camera_init,将所有/camera_init改成camera_init,也就是去掉斜杠,这样再回到工作空间重新编译lego-loam。3、速腾16线激光雷达RS-16 ----- 3D建图算法LeGO-LOAM的使用(Ubuntu18.04 + ROS Melodic)_速腾16线 lego loam_杰尼君的博客-优快云博客。

qq_59475883的博客 2567

JavaScrip实现发布订阅模式

js手写发布订阅模式

weixin_50789156的博客 1820

【COMSOL超材料和超表面仿真设计】

超材料和超表面的设计通常需要自定义材料属性。在COMSOL中,可以通过定义介电常数和磁导率的张量来模拟超材料的特性。对于超表面,通常需要定义表面阻抗或等效电路模型。

weixin_51101456的博客 1661

【MATLAB】通过计算曲率和曲率变化率来实现对曲线波浪程度

这段代码将计算给定曲线的曲率,并与给定阈值进行比较以检测拐角。函数是MATLAB中一个常用的函数,可以用于计算曲线在每个点处的曲率。它基于一种被称为“local least squares fitting” 的方法,通过拟合每个点周围的一小段曲线来计算曲率。MATLAB中可以使用多种方法实现拐角检测,其中一种方法是基于曲率半径的算法。该算法通过计算曲线上每个点处的曲率半径,找到拐角和弯曲处。是一个可选参数,用于控制拟合曲线的平滑度,取值范围为0到1,越接近1表示曲线越平滑。表示曲线在每个点处的曲率,

Fanjufei的博客 1918

js手写发布订阅者模式

【代码】js手写发布订阅者模式。

Dou_Hua6的博客 860

Open3D 计算点云法向量的夹角【2026最新版】

计算法向量的夹角,博客长期更新,本文最新更新时间为:2026年3月7日。

点云侠的博客 3129

手写简单的发布订阅者模式

【代码】手写简单的发布订阅者模式。

hahayua的博客 273

Windows11安装配置openclaw+deepseek(大龙虾)

密码可以随便设置(注意wsl系统本质上是linux系统,设置密码系统是不会像windows一样显示*点位符的),输入密码后敲回车再次输入密码,输入后敲回车。如果不小心关闭这个界面,可以再次进入powershell,输入wsl进行系统。在powershell中输入:curl -fssL https://openclaw.ai/install.sh | bash。下面是否通过第3方平台和openclaw交互,我选择j最后一项:skip for now。到下面这一步,可以通过键盘的左箭头选择Yes.

mahailiang的专栏 343

C# 工业视觉性能极致优化:多线程推理池 + 对象复用 + 批量检测,速度提升 10 倍实战

set;} // 输入图像set;} // 异步返回结果set;} // 用于监控延迟性能优化不是魔法,而是对资源生命周期的精细管理和对硬件特性的充分利用。多线程池解决了 CPU/GPU 闲置问题。对象池解决了 GC 停顿问题。零拷贝解决了总线带宽瓶颈。严格的 Dispose解决了内存泄漏问题。这套架构已在多个高速锂电、3C 电子检测产线落地,轻松应对 200ms 甚至 50ms 的严苛节拍。记住,在工业领域,稳定性与速度同等重要。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 300

js 手写一个发布订阅

这个简单实现仅作学习示例,实际开发中有更完善的发布订阅库可以选用,如Node.js中的Events模块等。但理解其基本原理和思想是非常重要的。使用时,先通过on方法订阅事件,然后通过emit方法发布事件从而执行回调。off方法用于取消之前的订阅关系。希望这个示例对您有所帮助,能加深对JavaScript事件和发布订阅模式的理解。emit方法:用于发布事件,触发事件执行订阅的回调函数。off方法:用于取消订阅,接收事件名和回调函数作为参数。on方法:用于订阅事件,接收事件名和回调函数作为参数。

小豆包 603

《UDS协议从入门到精通》系列——图解0x38:请求文件传输

详细解释UDS协议中0x38-请求上传服务的各个参数!!

车载系统攻城狮 3263

JS手写实现发布订阅设计模式

大部分前端应该对设计模式了解都不多,但是对Vue理解深刻的同学一定都知道发布订阅模式,因为Vue2的响应式就是基于Object.defineProperty + 发布订阅模式实现的。 今天我们就用JS简单实现一下发布订阅模式 // 观察者 watcher class Dep { constructor(callback) { this.subs = []; this.callback = callback; } addSub(sub) {

CreatorRay的博客 2022

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

前端设计模式,观察者模式和发布订阅者模式的区别及JS手写实现

前端,设计模式,常见设计模式,观察者模式,订阅发布者模式,两种模式的区别,JS手写设计模式

qq_40868156的博客 973

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

设计模式:发布订阅

发布订阅设计模式(观察者模式) 思想:准备一个容器,把到达指定时候到处理的事情,事先一一加入到容器中(发布计划,并且向计划表中订阅方法),当到达指定时间点,通知容器中的方法依次执行即可。 jQ版本demo演示效果: let $plan = $.Callbacks();//=>创建一个空的计划表:空容器 =>$PLAN setTimeout(function () { $plan...

杨兴元的博客 605

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

手写核心工具库:防抖节流、发布订阅、Promise、简易路由、简易 Vue 响应式

Hi,我是前端人类学!无论前端框架如何更迭,防抖节流、发布订阅、Promise、路由、响应式这五个核心模块始终是支撑应用的基石。手写它们不仅能深入理解底层原理,更能提升代码设计能力。本文将逐一实现并剖析其核心逻辑。

chaosweet的博客 289

前端手写代码高频题(2026 大厂 / 中小厂分梯度整理)

按划分,校招 / 社招通用,面试手写 100% 覆盖。

2302_80473627的博客 264

js设计模式之发布/订阅模式模式

一、前言   发布订阅模式,基于一个主题/事件通道,希望接收通知的对象(称为subscriber)通过自定义事件订阅主题,被激活事件的对象(称为publisher)通过发布主题事件的方式被通知。   就和用户订阅微信公众号道理一样,一个公众号可以被多个用户同时订阅,当公众号有新增内容时候,只要发布就好了,用户就能接收到最新的内容。   js中的事件监听机制就是一种观察者模式。 二、和观察者...

大灰狼的小绵羊哥哥的博客 996

JavaScript设计模式:四、发布订阅模式

JavaScript设计模式:四、发布订阅模式 文章目录JavaScript设计模式:四、发布订阅模式一、概述1. 观察者模式2. 发布订阅模式3. 观察者模式是不是发布订阅模式 一、概述 观察者模式: 观察者(Observer)直接订阅(Subscribe)主题(Subject),而当主题被激活的时候,会触发(Fire Event)观察者里的事件。 发布订阅模式: 订阅者(Subscriber)把自己想订阅的事件注册(Subscribe)到调度中心(Topic),当发布者(Publisher)发布该事件(

SpringWaterLikeMe 2952

js设计模式——发布订阅模式

发布订阅模式是一种常用的设计模式,它定义了一种一对多的关系,让多个订阅者对象同时监听某一个主题对象,当主题对象发生变化时,它会通知所有订阅者对象,使它们能够自动更新。发布订阅模式是一种常用的设计模式,它可以实现对象间的松耦合通信,支持异步处理和多对多的通信。它也有一些缺点,比如可能会造成内存泄漏、程序复杂性增加和信息不一致性。在使用发布订阅模式时,需要注意合理地设计发布者和订阅者之间的关系,避免出现不必要的问题。

梦是太匆 5175

手写轮子系列四 —— 手写发布订阅

发布订阅模式能够广泛地应用于异步编程中,同时还可以让对象松耦合的联系在一起。这种设计模式也常见用于各大框架中,来简单看看然后自己写一个吧!!

我是张跑跑 849

JS中的发布订阅

JS中的发布订阅设计模式 基于单例设计模式构建发布订阅(对象) /* * 设计模式:是一种思想,用来有效管理代码的思想 + 单例设计模式:对象 + 工厂设计模式:面向对象创建实例 + Promise设计模式:异步管理 + 发布订阅设计模式 + ... 发布订阅: 来源于 DOM2级事件池 DOM2级事件池机制:可以同时给同一事件类型行为绑定多个方法,当事件触发,绑定的方法依次被执行 */ /* function dom1()

qq_32021429的博客 302

js设计模式 发布订阅模式

js设计模式 发布订阅模式发布订阅模式 发布订阅模式 发布订阅模式中有一个注册中心,有订阅和发布方法,订阅者需要带着方法去订阅一个事件,当这个事件被发布时,订阅者执行这个方法 import * as _ from 'lodash'; // import { MntrCurrentDimension } from './mntr-current-dimension'; /* * @Descrip...

宋大王的博客 513

前端必须掌握的设计模式——发布订阅模式

发布订阅模式作为观察者模式的改良版,适合较为复杂的应用场景,前端最经典的应用就是Vue的数据双向绑定,Vue数据双向绑定的代码也会更加符合代码设计的艺术。

划雨悦潭之赋的博客 2325
上一篇: 【JavaScript】将数组某个元素排到第一位
下一篇: 【JavaScript】手写深拷贝 2.0(更新 2022-07-15)
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值