ES6&ES5实现观察者模式(发布订阅者模式)

那些年 你需要解决的观察者模式/发布-订阅模式(ES6语法) 这是参考的地址: https://www.jb51.net/article/137419.htm;(看了很多版本觉得这个很不错) 在笔试和一些面试经验交流的帖子中进程出现订阅者模式,想着自己还不是很清楚,所以得解决,但是我们的目的应该不仅仅是对付笔试和面试,应该了解这个模式的思想:松散耦合代码形式!更多的大家看别的描述吧,会比我更清楚,这里也不累述,只是加入自己更加通俗的理解:我们的_event... 阅读详情

ES6

class Observer{
	constructor(){
		this.handle = [];
	}
	addSubscribe(topic, fn) {
		this.handle.push({topic: topic, fn: fn});
		console.log(this.handle);
	}
	removeSubscribe(topic, fn) {
		let index;
		this.handle.forEach(function(data, i) {
			if(data.topic == topic && data.fn == fn){
				index = i;
			}
		});
		delete this.handle[index];
		console.log(this.handle);
	}
	publish(topic, message) {
		this.handle.forEach(function(data) {
			if(data.topic == topic) {
				data.fn(message);
			}
		})
	}
}

ES5

在nodejs中通过EventEmitter实现了原生的对于这一模式的支持。在JavaScript中事件监听机制就可以理解为一种观察者模式

function PubSub() {
	this.handlers = {};
}
PubSub.prototype = {
	//订阅事件
	on: function(eventType, handler) {
		var self = this;
		if(!(eventType in self.handlers)) {
			self.handlers[eventType] = [];
		}
		self.handlers[eventType].push(handler);
		return this;
	},
	//触发事件(发布事件)
	emit: function(eventType) {
		var self = this;
		var handlerArgs = Array.prototype.slice.call(arguments, 1);
		for(var i = 0; i < self.handlers[eventType].length; i++) {
			self.handlers[eventType][i].apply(self,handlerArgs);
		}
		return self;
	},
	//删除订阅事件
	off: function(eventType, handler){
		var currentEvent = this.handlers[eventType];
		var len = 0;
		if(currentEvent) {
			len = currentEvent.length;
			for(var i = len - 1; i >= 0; i--){
				if(currentEvent[i] === handler) {
					currentEvent.splice(i,1);
				}
			}
		}
		return this;
	}
};

var pubsub = new PubSub();
var callback = function(data) {
	console.log(data);
};

//订阅事件A
pubsub.on('A', function(data){
    console.log(1 + data);
});
pubsub.on('A', function(data){
    console.log(2 + data);
});
pubsub.on('A', callback);
//触发事件A
pubsub.emit('A', '我是参数');
//删除事件A的订阅源callback
pubsub.off('A', callback);
pubsub.emit('A', '我是第二次调用的参数');
JavaScript-观察者模式(publish/subscribe) JavaScript-观察者模式(publish/subscribe)观察者模式又叫做发布订阅模式,它定义了一种一对多的关系,让多个观察者对象同时监听某一个主题对象,这个主题对象的状态发生改变时就会通知所有观察着对象。它是由两类对象组成,主题和观察者,主题负责发布事件,同时观察者通过订阅这些事件来观察该主体,发布者和订阅者是完全解耦的,彼此不知道对方的存在,两者仅仅共享一个自定义事件的名称。 在N 阅读详情

相关推荐

基于ES6的轻量级以广播订阅模式封装的JSBridge

基于ES6的轻量级,以广播-订阅模式封装的JSBridge,沟通原生端与webview。兼容iOS9 以及安卓4.0 。

使用 es3、es5、es6 实现简单工厂模式、单例模式、观察者模式、发布订阅模式

前言 最近公司晋升岗位里面的一道小题《使用 es3 实现简单工厂模式、单例模式、观察者模式、发布订阅模式》,结束之后发现自己还要补好多´д` ;,抽空把里面几道小题,重新复习了一遍,扩充到es3、es5、es6,并做了笔记(再次膜拜公司出题大佬)。 完整版github代码地址:https://github.com/xuhuihui/smallDemo/blob/master/demo/demo...

无聊者进来逛逛 886

【codex教程】Codex 注册和使用教程(2026最新版)

Codex 是 OpenAI 推出的 AI 编程助手,可以帮助开发者阅读代码、修改代码、运行命令、生成测试、排查 bug、做代码审查,也可以在终端、IDE、Codex App 或网页端使用。根据 OpenAI 帮助中心,截至 2026 年 6 月,Codex 已包含在 Free、Go、Plus、Pro、Business、Edu 和 Enterprise 等 ChatGPT 方案中,但不同套餐的使用额度会有所不同。适合开发者在终端中使用。如果你想在命令行里使用 Codex,可以安装 Codex CLI。

与时俱进,开放共享 2万+

knockout中subscribe()方法

subscribe(callback,target,event) 该方法也是实现监控功能的,当属性值发生变化时就会执行回调函数,回调函数中的参数的值就是触发事件获取的值 callback:(必须)回调函数 target:(可选)定义的值this的回调函数 event:(可选)对于通知的注册的事件,默认是change,即当通知改变时就会触发该事件,执行回调函数, 例如:

遇见最好的自己,才能遇见最好的人! 6255

浮点数精度陷阱全解析:从IEEE 754到深度学习部署选型

在计算机数值计算中,浮点数是表示带小数数字的标准方式,但它的存储规则决定了精度和边界天生存在限制。许多开发者都曾遭遇过0.1+0.2不等于0.3的尴尬,或是模型训练中loss变成NaN的困扰,这些问题的根源往往指向IEEE 754标准中的规格化、非规格化表示及舍入规则。理解浮点数的底层原理,不仅能避开直接的比较判断陷阱,还能指导我们在不同场景下做出合理的技术选型。从C语言的printf到Python的repr,从嵌入式串口打印到深度学习中的FP32、FP16、BF16、TF32格式,浮点数知识贯穿底层开发和

weixin_34314962的博客 463

Python实战:超分辨率图像质量评估全攻略——PSNR、SSIM、LPIPS与NIQE的代码实现与优化

本文详细介绍了在Python中实现超分辨率图像质量评估的完整方案,涵盖PSNR、SSIM、LPIPS和NIQE四大核心指标。通过模块化代码设计、多进程并行处理和GPU加速优化,帮助开发者构建高效、可扩展的评估系统,并提供了实战避坑指南与结果解读方法。

weixin_29053073的博客 474

观察者模式与发布订阅模式

发布-订阅模式其实是一种对象间一对多的依赖关系,当一个对象的状态发送改变时,所有依赖于它的对象都将得到状态改变的通知。与观察者模式的定义相似,其最大的特点是:发布方与订阅方互不相知,双方都发送自己的消息内容到第三方,由第三方来处理。

长歌的博客 1260

步进电机梯形加减速算法的实现

步进电机梯形加减速算法的实现

m0_69251699的博客 1318

JavaScript设计模式之观察者模式

观察者模式是前端应用最多的一种设计模式 介绍: 当对象间存在一对多关系时,则使用观察者模式(Observer Pattern)。比如,当一个对象被修改时,则会自动通知它的依赖对象。观察者模式属于行为型模式。 发布&订阅 UML类图: 观察者模式的实现思路:把多个观察者放入主题中,由主题来控制消息的变化进行消息的分发。 代码实现: // 主题,接收状态变化,触发每个观察者 clas......

EmotionComputer 920

芯片设计中的复位艺术——从异步复位同步释放到复位树构建

本文深入探讨了芯片设计中复位策略的核心技术与工程实践。重点解析了异步复位同步释放这一黄金方案的原理与优势,它通过复位同步器解决了异步复位释放时的时序风险。文章进一步阐述了如何构建稳健的复位树以应对大规模SoC设计,并分析了多时钟域与低功耗场景下的复位设计挑战,为提升芯片可靠性提供了系统性的方法论。

neovim7hacker的博客 486

移动端HDR

移动HDR是近年来移动设备最大的技术进步之一。自2017年起,它就开始出现在旗舰手机上,包括苹果(Apple)和三星(Samsung)在内的大多数制造商都加入了这一行列。这一趋势在过去几年里席卷了整个电视行业,但在最近几年才真正深入人心。而且,最近,将更多的HDR内容放到移动设备上的趋势已经加快。对于这种新兴技术来说,它还处于相对早期的阶段,但它也非常有趣,值得关注。 HDR是什么? HDR是...

ISP行业的忠实粉丝 1340

17 发布订阅模式及实战

#如何实现发布--订阅模式? 1.首先想好谁是发布者(比如上面的卖家) 2.然后给发布者添加一个缓存列表,用于存放回调函数来通知订阅者 3.发布消息,发布者遍历这个缓存列表,依次触发里面存放的订阅者回调函数 var shopObj={}//定义发布者 shopObj.list=[]//缓存列表,存放的是订阅的函数 //增加订阅者 shopObj.listen=function(key,fn){ if(!this.list[key]){ this.list[key]=[]

weixin_50464014的博客 155

普通用户也能免费使用 SAP Joule!

点击 SAP Joule 给出的按钮之后,SAP Business Application Studio 左侧显示的界面,就从 SAP Joule 替换成了 SAP Fiori tools 的 Project Accelerator 工具。接下来就是在后者中标准的操作流程了。笔者之前的文章,有朋友提问,既然 ChatGPT,DeepSeek,Grok 这些主流 AI 工具,回答 SAP 相关问题时都经常翻车,那 SAP 自家的 Joule 表现又如何呢?还有朋友评论:如何才能使用 SAP Joule?

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 1018

es6版·观察者模式+发布订阅模式

一、原理图 二、观察者模式 1、手动触发的观察者模式 /* * @Author: laifeipeng * @Date: 2019-02-22 15:44:56 * @Last Modified by: laifeipeng * @Last Modified time: 2019-02-22 16:29:36 */ /*************** 观察者模式 **********...

weixin_33735077的博客 788

javafx结合Scene Builder自定义fxml实现漂亮的登录界面、自定义最小化、关闭按钮

本节主要介绍了如何结合Scene Builder工具来制作一个好看又漂亮的登录界面,以及介绍了如何在程序中调用生成界面文件fxml文件,如何获取到fxml文件中的组件等,并演示登录、最小化和关闭等功能。

c1007857613的专栏 5221

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

es6 发布-订阅模式

class Event { constructor() { //保存事件列表 this.eventList = []; } on(key,fn){ if ( !this.eventList[ key ] ){ this.eventList[ key ] = []; ...

aihe8259的博客 612

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

ES6发布订阅设计模式实现

发布订阅就是将所有事件发到一个池子(数组)中,期间可以增减方法,要使用的时候统一依次执行,参数只能传相同的。期间要解决的问题是数组去重、数组塌陷。 let _subsribe = () => { class sub { constructor() { this.pond = [] } add(func) { ...

目标前端大佬 606

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

js发布订阅者模式es6实现及其图解

直接上代码 //主题 class Dep{ constructor(callback){ this.subs=[]; //每个主题更新数据的方法不一样,所以需要传进来 this.callback=callback; } addSub(sub){ this.subs.push(sub); return this; } notify(){...

一袋米要扛几楼_ 2904

JavaScript实现观察者和发布订阅者模式

一、基本概述 不管是观察者模式还是发布订阅者模式,参与角色只有两种,只是他们之间沟通机制不一样; 观察者模式:观察者模式的两种角色:“观察者和被观察者”,他们之间是直接进行关联,直接通信。所以他们需要知道对方是谁。 2. 发布订阅者模式:该模式也有两种角色:“发布者和订阅者”,他们是通过中间层进行相互通信,并将双方关系进行绑定。这两种角色相互不知道对方是谁。 总结:观察者模式和发布订阅者作用的目的其实是一样的,只不过他们之间的实现方式不一样。发布订阅者模式相对于观察者模式耦合度更低,因为他们之间不

u012475786的专栏 768

es6实现发布订阅

const _pond = Symbol(); class Subscribe { constructor() { this[_pond] = new Map(); } add(key, fn) { if (typeof key != "string" && typeof fn != "function") { ...

sinat_35308384的博客 714

es6原生实现观察者模式

aliven1的博客 1076

es6观察者模式实现

  //es6实现 借助set实现 function obfunction(oldval,newval){ console.log(oldval+'变成了'+newval); } class targetObser{ constructor(age,name){ this.age=age; this.name=name; } set name(val){ console.log(nam...

脚步 894

HihoCoder - 1721 回文字符串2(字符串)

愚人节那天,小Ho在小Hi的一个回文字符串中添加了一个字符。你能帮助小Hi找到被添加的是第几个字符吗?Input一个只包含小写字母的字符串S。对于70%的数据,|S| ≤ 1000  对于100%的数据,|S| ≤ 500000Output输出一个整数K,表示删除第K(从1开始计数)个字符后,S会变成一个回文字符串。  数据保证有解。如果有多个解,输出其中K最小的。Sample Inputaaba...

dsaghjkye的博客 515

初学es6写了个观察者模式,请多指教!!!!

/** * Created by richard on 2017/7/19. */ console.log("------------observer观察者模式-------------"); class Observer{ constructor(){ this.handle = [];//相关订阅fn } addSubscribe(t

瓶起子的博客 982

原生js实现$on、$emit和$off

let obj = {}; window.$on = (name, fn) => { if (!obj[name]) { obj[name] = []; } obj[name].push(fn); } window.$emit = (name, value) => { if (obj[name]) { obj[nam...

GarenWang的博客 1613
上一篇: JavaScript数组去重
下一篇: JavaScript垃圾收集
DoubleSRZee
博客等级 码龄10年 7粉丝 41原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值