• angular 脏值检测
  • backbone 发布者订阅者模式
  • vue 数据劫持(结合发布者订阅者的模式)

关于Object.defineProperty()

一、主要实现思路:

  1. observe数据监视器:通过对数据对象属性及其子属性进行遍历递归,通过Obeject.defineProperty()方法加上setter,getter,来实现监听数据的变化。
  2. 添加订阅者功能:用来实现数据发生变化时通知订阅者,方法如下,维护一个数组用来收集订阅者,当数据变化时触发notify(),来调用update()方法实现更新。
  3. 通过dep添加订阅者。
  4. 实现Compile: 主要的任务就是解析模板指令,将模板中的变量替换成数据,初始化渲染页面视图,再给每个指令下对应的节点绑定更新函数,添加订阅者,当数据发生变化时,将得到通知,然后更新视图。需要注意的一点是:为避免频繁操作DOM节点造成性能的过度消耗,可以将el节点暂时转换成fragment文档碎片,进行编译解析。完事儿再将fragment添加回原来的真实dom节点中。
  5. 实现Watcher:它作为主要的任务是成为Compile及Observe数据监视器之间通信的桥梁。

1、在自身实例化时往属性订阅器(dep)里面添加自己
2、自身必须有一个update()方法
3、待属性变动dep.notice()通知时,能调用自身的update()方法,并触发Compile中绑定的回调,则功成身退。

通过Object.defineProperty()方法,递归数据对象的每个属性,都添加上 setter, getter,以实现数据被赋新值时触发setter,实现监听。并通过创建的通知订阅者功能,通知订阅者。

var data = {name: 'kindeng'};
observe(data);
data.name = 'dmq'; // 哈哈哈,监听到值变化了 kindeng --> dmqfunction observe(data) {if (!data || typeof data !== 'object') {return;}// 取出所有属性遍历Object.keys(data).forEach(function(key) {defineReactive(data, key, data[key]);});
};function defineReactive(data, key, val) {observe(val); // 监听子属性Object.defineProperty(data, key, {enumerable: true, // 可枚举configurable: false, // 不能再defineget: function() {return val;},set: function(newVal) {console.log('哈哈哈,监听到值变化了 ', val, ' --> ', newVal);val = newVal;}});
}

如何完成订阅者功能:首先维护一个数组subs,其次通过监听数据对象的属性是否变化,再调用notify()实现对数据对象的更新。

function defineReactive(data, key, val) {var dep = new Dep();observe(val); // 监听子属性Object.defineProperty(data, key, {set: function(newVal) {if (val === newVal) return;console.log('哈哈哈,监听到值变化了 ', val, ' --> ', newVal);val = newVal;dep.notify(); // 通知所有订阅者}});
}
function Dep() {this.subs = [];
}
Dep.prototype = {addSub: function(sub) {this.subs.push(sub);},notify: function() {this.subs.forEach(function(sub) {sub.update();});}
};

浅谈MVVM是如何实现数据双向绑定的?相关推荐

  1. vue的数据双向绑定原理

    前言: 什么是数据双向绑定? vue是一个mvvm框架,即数据双向绑定,即当数据发生变化的时候,视图也就发生变化,当视图发生变化,数据也会跟着同步变化.这也算是vue的精髓之处了.单项数据绑定是使用状 ...

  2. python读取图像数据流_浅谈TensorFlow中读取图像数据的三种方式

    本文面对三种常常遇到的情况,总结三种读取数据的方式,分别用于处理单张图片.大量图片,和TFRecorder读取方式.并且还补充了功能相近的tf函数. 1.处理单张图片 我们训练完模型之后,常常要用图片 ...

  3. 嵌入式AI —— 6. 为糖葫芦加糖,浅谈深度学习中的数据增广

    没有读过本系列前几期文章的朋友,需要先回顾下已发表的文章: 开篇大吉 集成AI模块到系统中 模型的部署 CMSIS-NN介绍 从穿糖葫芦到织深度神经网络 又和大家见面了,上次本程序猿介绍了CMSIS- ...

  4. 前端笔记之微信小程序(二){{}}插值和MVVM模式数据双向绑定指令API

    一.双花括号{{}}插值和MVVM模式 1.1 体会{{}}插值 index.wxml的标签不是html的那些标签,这里的view就是div. {{}}这样的插值写法,叫做mustache语法.mus ...

  5. Vue基础——VueJS是什么、Vue的优缺点、vue2和vue3的模板区别、MVVM数据双向绑定、Vue的安装和使用、Vue模板语法-文本渲染、常用的vue的指令

    目录 一.VueJS是什么? 二.Vue的优缺点 三.MVVM 数据双向绑定 四.Vue的安装和使用 五.Vue模板语法-文本渲染 六.常用的vue的指令 一.VueJS是什么? 它是一个轻量级MVV ...

  6. oracle全表扫过程讲解,CSS_浅谈存取Oracle当中扫描数据的方法,1) 全表扫描(Full Table Scans, FTS) - phpStudy...

    浅谈存取Oracle当中扫描数据的方法 1) 全表扫描(Full Table Scans, FTS) 为实现全表扫描,Oracle读取表中所有的行,并检查每一行是否满足语句的WHERE限制条件一个多块 ...

  7. [转] 浅谈脱壳中的附加数据问题(overlay)

    浅谈脱壳中的附加数据问题(overlay) Author:Lenus From: www.popbase.net E-mail:Lenus_M@163.com -------------------- ...

  8. 浅谈脱壳中的附加数据问题(overlay)

    浅谈脱壳中的附加数据问题(overlay) Author:Lenus From: www.popbase.net E-mail:Lenus_M@163.com -------------------- ...

  9. 双向绑定 当obj的值修改时_JavaScript进阶之深入理解数据双向绑定

    前言 谈起当前前端最热门的 js 框架,必少不了 Vue.React.Angular,对于大多数人来说,我们更多的是在使用框架,对于框架解决痛点背后使用的基本原理往往关注不多,近期在研读 Vue.js ...

最新文章

  1. l-lsblk查看设备可用块设备
  2. ThreadLocal的使用及原理分析
  3. VS2015编译ffmpeg 3.4.2
  4. 如何看待papi酱的个人平台papitube?
  5. Xftp连接到Linux服务器时提示连接失败的配置
  6. mysql导出数据到本地_mysql怎么导出数据到本地文件
  7. 【Python】蟒蛇绘制
  8. python读取表格画散点图_python学习笔记-绘制散点图
  9. ubuntu自动加载硬盘分区
  10. CentOS7环境下MySQL升级
  11. tcp/ip IP数据报头详解
  12. 乐高叉车wedo教案_24乐高教育wedo编程摩天轮教案
  13. ARCGIS小工具(插件)免费版_自取_GIS插件_工具_其他
  14. MATLAB多元线性拟合——03
  15. keil(MDK)中出现error: #513:
  16. matlab用switch画出分段函数,matlab用switch语句绘出分段函数 在 的图像
  17. MOXA NPort5630串口设备联网服务器
  18. Android实现自定义铃音
  19. 百度地图离线开发demo-迁徙图
  20. ubuntu优化卸载不常用软件

热门文章

  1. KCSJ-13 课程设计-“手柄套“零件机械加工工艺及Φ12孔钻孔夹具设计(说明书+CAD装配图 零件图 毛坯图+工序卡+过程卡)
  2. 基于ARM11的无线视频监控系统
  3. 预测算法-三次指数平滑法(Holt-Winters)
  4. 产品面试常见问题和解读(一)
  5. java获取系统斜线_java从含反斜线路径截取文件名
  6. 未来教育所需要的七个知识
  7. win11 x86 系统部署arm架构的虚拟机(银河麒麟为例)
  8. 年薪 80W 程序员相亲被鄙视??那,如果程序员都消失了
  9. 廖雪峰的python笔记(一)--入门知识
  10. EN 1096-4: 建筑玻璃.涂层玻璃.第4部分:产品标准