博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
vue.js实现原理 -- 订阅者,发布者模式
阅读量:7223 次
发布时间:2019-06-29

本文共 1446 字,大约阅读时间需要 4 分钟。

zh众所周知,vue2.x版本是通过Object.defineProperty() 种的get进行拦截,set进行发送, 

其实这只是表面理解,实际运用的是 JavaScript 的  订阅者、发布者模式。

首先,了解一下什么是  订阅者、发布者模式 吧。

w3c 上是这么定义的 

可以用一个图来理解 

首先我们来实现一下使用原型链的写法吧

//定义一个函数,用来承载function publisher () {    //定义一个空数组用来接收传递过来数据    this.arr = [];}publisher.prototype = {    //订阅    subscribe : function (fn) {        //订阅将'订阅者'push到arr数组中        this.arr.push (fn)    },    //解除订阅    unSubscribe : function (fn) {        //过滤订阅者,如果'订阅者'el存在arr数组中,就解绑订阅        this.arr = this.arr.forEach(function (el) {            if(el !== fn) {                return el;            }        })    },    //更新订阅内容    upDate : function (o,thisObj) {        //o => 剩余订阅者         var scoped = thisObj || window ;        //或者        var scoped = thisObj || this.subscribe;        this.fns.forEach (function (el) {            // scoped 可以随便设置,el最终会替换scoped,将o 剩余订阅者传递进arr数组,将               订阅的人的信息打印出来            el.call(scoped,o)        })     }}//创建一个实例var newSubScribe = new publisher () ;//创建一个订阅者var user = function (data) {    console.log (` 第一位订阅者 ${data} 订阅了。`)}//创建第二位订阅者var newUser = function (data) {    console.log (` 第二位订阅者 ${data} 订阅了。`)}//绑定订阅newSubScribe.subscribe(user);newSubScribe.subscribe(newUser);//更新订阅内容,看下效果newSubScribe.upDate(`Z先生`);//解绑第一个订阅者newSubScribe.unSubscribe(user);//在更新下数据newSubScribe.upDate(`Z女士`);/*    下面我们看下打印结果*/复制代码

可以看到,已经实现了,第一位订阅者没有了,只剩第二位 订阅者了,当然实现的方法有很多种,这只是其中一种使用原型链

实现

转载于:https://juejin.im/post/5c7f6efce51d45043849da2f

你可能感兴趣的文章
mysqld_safe 无法启动的原因
查看>>
MySQL数据库的优化(上)单机MySQL数据库的优化
查看>>
hdu4366 Successor
查看>>
Scala使用Akka模拟RPC机制代码2
查看>>
this与JavaScrip中的四种调用模式
查看>>
java 实现打印当前月份的日历
查看>>
Base64转码和解码的帮助类
查看>>
侃侃正向代理和反向代理
查看>>
PLSQL连接oracel数据库_用户无法登陆_oci.dll_配置问题
查看>>
李洪强iOS经典面试题37-解释垃圾回收的原理
查看>>
多校第二场 1004 hdu 5303 Delicious Apples(背包+贪心)
查看>>
Executor , ExecutorService 和 Executors
查看>>
关于图数据库查询语言:Cypher
查看>>
Android中m、mm、mmm、mma、mmma的区别
查看>>
知道各个层使用的是哪个数据交换设备
查看>>
MySQL索引类型总结和使用技巧以及注意事项
查看>>
iOS:在cell中使用倒计时的最佳方法
查看>>
深入浅出空间索引:为什么需要空间索引
查看>>
EF 数据版本号,处理具体使用方法 RowVersion / Timestamp 使用方法。进行自动处理并发修改...
查看>>
centos6.5关闭ipv6
查看>>