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

vue.js实现原理 -- 订阅者,发布者模式相关推荐

  1. Vue.js 运行原理解析、vue源码剖析

    Vue.js 运行机制全局概览 全局概览 这一节笔者将为大家介绍一下 Vue.js 内部的整个流程,希望能让大家对全局有一个整体的印象,然后我们再来逐个模块进行讲解.从来没有了解过 Vue.js 实现 ...

  2. JavaScript设计模式——订阅者-发布者模式简单实现

    一.什么是发布者-订阅者模式 订阅者把自己想订阅的事件注册到调度中心,当发布者发布该事件到调度中心,就是该事件触发时,由调度中心统一调度订阅者注册到调度中心的处理代码. 基本思想就是内部保存了一个对象 ...

  3. Vue.js说说组件

    什么是组件:组件是Vue.js最强大的功能之一.组件可以扩展HTML元素,封装可重用的代码.在较高层面上,组件是自定义的元素,Vue.js的编译器为它添加特殊功能.在有些情况下,组件也可以是原生HTM ...

  4. 使用Vue.js初次真正项目开发-2018/07/14

    一.组件化 使用Vue.js进行开发,按照MVVM模式,围绕数据为核心,进行开发. 开发过程根据业务和功能组件化,组件化一方面让我们开发思路更加清晰,另一方面对于数据的处理和控制变得更加简单,毕竟一个 ...

  5. Vue.js not detected

    安装vue devtools工具,在chrome中一直是灰色,title是Vue.js not detected ① F12关闭开发者模式 ② 刷新 ③ 然后再按F12就好了 网上看到的,居然真的有用 ...

  6. 学习Vue.js实战(一)

    Vue.js是什么? Vue (读音 /vjuː/,类似于 view) 是一套用于构建用户界面的渐进式框架. (所谓Progressive,就是可以一步一步的有阶段性的使用vue.js.其简单小巧,压 ...

  7. Vue.js 内部运行机制之总结 常见问题解答

    Vue.js 内部运行机制之总结 & 常见问题解答 总结 在本小册的第一节中,笔者对 Vue.js 内部运行机制做了一个全局的概览,当时通过下面这张图把 Vue.js 拆分成一个一个小模块来介 ...

  8. 为Angular(2+)开发人员提供带TypeScript的Vue.js

    目录 介绍 单页应用程序的演变(SPA) 三大框架概述 Angular开发者的Vue.js 学习Vue.js Vue.js页面的剖析 构建示例应用程序 TypeScript的案例 入门--Vue.js ...

  9. 推送近期三波关于Vue.js的资讯

    原文来自:集web前端最近很火的vue2框架资源:定时更新,欢迎Star一下. 推送自己整理近期三波关于Vue.js的资讯: 这里就抛砖引玉了,望有更屌的资源送助攻. 第一波 vue-js-toggl ...

最新文章

  1. Java网络编程从入门到精通(4):DNS缓存
  2. 架设SharePoint工作组网站(上)
  3. Boost::context模块callcc的斐波那契测试程序
  4. php require vs. include
  5. T-SQL:谓词和运算符(六)
  6. Maven打包三种方法和常用命令大全
  7. 903C Boxes Packing
  8. linux jq下载文件,linux 之 jq
  9. (原创推荐文章)kerberos服务器端与客户端
  10. 低成本WebIDE(centos7+codeserver+内网穿透)
  11. 基于OpenCV做图像数据增强(平移、镜像、缩放、旋转、仿射)
  12. platform.js
  13. 客户端与服务器端的区别
  14. 怎么查询MySQL的安装路径?
  15. java面试突击-2022最新迭代redis\mq\springCloud-纯手打
  16. 【数论】基础数论概念
  17. 复杂任务处理三部曲:系统性思维、结构化思维、流程化管理
  18. 47-jQuery介绍
  19. Linux中常用命令(更详细)
  20. neo4j禁用服务器身份验证,Neo4j协议错误:服务器关闭连接

热门文章

  1. MySQL:(六)、(七)、(八)
  2. 学习笔记3--传感器技术
  3. 国债逆回购和债券型基金基础
  4. scp复制文件,过滤多个目录或者文件 rsync
  5. MIMO SISO MISO SIMO通俗解释
  6. 数控技术和装备发展趋势及对策
  7. 《“蓝桥杯”全国软件和信息技术专业人才大赛(电子类)实训指导书》
  8. excel 无法使用 ctrl + enter 填充空值
  9. (BIOS+UEFI双启)天意u盘维护系统技术员版V1.0
  10. 禁用360浏览器6.2自带的Flash Player