ES6入门系列 ----- 使用Proxy 实现观察者模式
观察者模式是指函数自动观察数据对象的变化, 一旦对象有变化,函数就会自动执行。
它定义了一种一对多的依赖关系,我们用Proxy来实现一个简单的观察者模式(PS: 初学我们认为
观察者模式 == 发布订阅模式, 其实它们有点不同)。
例子:
const callbacks = new Set();
const observe = fn => callbacks.add(fn);
const observable = obj => new Proxy(obj, {set}); function set (target, key, value, receiver) {
const result = Reflect.set(target, key, value, receiver);
callbacks.forEach(observe => observe());
return result;
}
// 一个可观察的对象
const person = observable({name: 'liu', age: 18}); function change() {
console.log(`${person.name} is ${person.age}`);
} observe(change); person.age = 19;
- 首先定义了一个observe 用来存储 要触发的函数。
- 然后定义了一个observable 函数 对 对象的设值做了一层代理,拦截赋值操作, Reflect.set用来完成默认的设值行为, 然后触发函数。
- 每当对象调用对象内部的的set方法时,就会遍历触发我们添加进callbacks里的回调函数。
打印结果:当age发生变化时:打印出

这样我们就简单的实现了一个观察者模式。
ES6入门系列 ----- 使用Proxy 实现观察者模式的更多相关文章
- ES6入门系列三(特性总览下)
0.导言 最近从coffee切换到js,代码量一下子变大了不少,也多了些许陌生感.为了在JS代码中,更合理的使用ES6的新特性,特在此对ES6的特性做一个简单的总览. 1.模块(Module) --C ...
- ES6入门系列 ----- Reflect
Reflect 是ES6 为了操作对象而提供的新的API, 目的是: 将Object 上一些明显属于语言内部的方法,比如 Object.defineProperty 放到 Reflect对象上 ...
- ES6 入门系列 (一)ES6的前世今生
要学好javascript , ECMAScript标准比什么都强, ESMAScript标准已经用最严谨的语言和最完美的角度展现了语言的实质和特性. 理解语言的本质后,你已经从沙堆里挑出了珍珠,能经 ...
- ES6入门系列四(测试题分析)
0.导言 ES6中新增了不少的新特性,来点测试题热热身.具体题目来源请看:http://perfectionkills.com/javascript-quiz-es6/. 以下将一题一题来解析what ...
- ES6入门系列一(基础)
1.let命令 Tips: 块级作用域(只在当前块中有效) 不会变量提升(必须先申明在使用) 让变量独占该块,不再受外部影响 不允许重复声明 总之:let更像我们熟知的静态语言的的变量声明指令 ES6 ...
- ES6 入门系列 - 函数的扩展
1函数参数的默认值 基本用法 在ES6之前,不能直接为函数的参数指定默认值,只能采用变通的方法. function log(x, y) { y = y || 'World'; console.log( ...
- ES6 入门系列 - let 和 const 命令
let命令 基本用法 ES6新增了let命令,用来声明变量.它的用法类似于var,但是所声明的变量,只在let命令所在的代码块内有效. { let a = ; ; } a // ReferenceEr ...
- ES6入门系列二(数值的扩展)
ES6 在 Number对象上新增了很多方法 1 . Number.isFinite()判断是否为有限的数字 和全局的isFinite() 方法的区别是 isFinite('1') === tr ...
- ES6入门系列 ----- 对象的遍历
工作中遍历对象是家常便饭了,遍历数组的方法五花八门, 然而很多小伙伴是不是和我之前一样只会用for ...in.... 来遍历对象呢, 今天给大家介绍五种遍历对象属性的方法: 1, 最常用的for ...
随机推荐
- 备用APC队列
Windows内核分析索引目录:https://www.cnblogs.com/onetrainee/p/11675224.html 备用APC队列 占坑:这一节跟进程挂靠相关联,我们先把进程挂靠给 ...
- 分析Jackson的安全漏洞CVE-2019-12086
CVE-2019-12086 Description A Polymorphic Typing issue was discovered in FasterXML jackson-databind 2 ...
- NuGet Install-Package 命令
例: Install-Package CefSharp.Wpf -Version 73.1.130 Install-Package CefSharp.Common -Version 73.1.130 ...
- java学习第一步-工欲善其事必先利其器
Java SE 磨刀不误砍柴工,工欲善其事必先利其器,咱们先搞好硬件配置,才能顺利的搞好Java学习 阶段一 1.认识Java 2.java发展史及用户 3.配置Java环境 4.JDK8下载安装 5 ...
- 一文学会JVM性能优化
实战性能优化 1 重新认知JVM 之前我们画过一张图,是从Class文件到类装载器,再到运行时数据区的过程,现在咱们把这张图不妨丰富完善一下,展示了JVM的大体物理结构图. 执行引擎:用于执行JVM字 ...
- 如何开发优质的 Flutter App:Flutter App 软件调试指南
本次博主带来的是<深入 Flutter 系列课程>第三讲,主要聊聊如何进行 Flutter App 代码的调试.本次课程将在GitChat平台上免费进行,通过本场 Chat,您将获得以下技 ...
- [b0044] numpy_快速上手
1 概念理清 2 创建数组 2.1 f1= np.array( [ [1,2,3,4], [2,3,4,5], [3,4,5,6] ]) 其他代码 a= np.array([ [ [3.4,5,6,8 ...
- more than 120 seconds|hung_task_timeout_secs 什么鬼?
//2019/7/31 18:41:14掐指一算应该resore完了呀,是不是天热想罢工?不过已经差不多30个小时了无意间一查 tail -500f /var/log/messages 发现有些“mo ...
- MySQL的基础架构
TCP/IP看不下去了,我觉得还是从应用层入手,接下来2个月我将主要学习数据库相关和算法知识,网络我一直不熟,所以看起专业书籍很吃力,可以说是浪费时间,这次数据库学习目标是先将方向纠正一下,然后其中的 ...
- Vue 知识点个人总结
Vue 脚手架 脚手架 3 的版本 ---- webpack 4 cnpm install -g @vue/cli-----全局安装组件 vue create myapp-----命令行创建项目 或者 ...