Vue数据驱动模拟实现2


Posted in Javascript onJanuary 11, 2017

一、前言

在随笔“模拟Vue之数据驱动1”结尾处,我们说到如果监听的属性是个对象呢?那么这个对象中的其他属性岂不就是监听不了了吗?

如下:

 Vue数据驱动模拟实现2

倘若user中的name、age属性变化,如何知道它们变化了呢?

今儿,就来解决这一问题。

通过走读Vue源码,发现他是利用Observer构造函数为每个对象创建一个Observer对象,来监听数据的,如果数据中的属性又是一个对象,那么就又通过Observer来监听嘛。

其实,核心思想就是树的先序遍历(关于树,可参考here)。如我们将上述Demo中的data数据,图形化一下,就更加明白了,如下:

Vue数据驱动模拟实现2 

好了,理清了大体思路,下面我们就一起来创建一个Observer吧。

二、Observer构造

Observer整体结构如下:

function Observer(data){
 //如若this不是Observer对象,即创建一个
 if(!(this instanceof Observer)){
 return new Observer(data);
 }
 this.data = data;
 this.walk(data); 
}

let p = Observer.prototype = Object.create(null);

p.walk = function(data){
 /*
 TODO:监听data数据中的所有属性,
 并查看data中属性值是否为对象,
 若为对象,就创建一个Observer实例
 */ 
}

p.convert = function(key, val){
 //TODO:通过Object.defineProperty监听数据 
}

好了,下面,我们一起来完成walk以及convert方法吧。

-walk-

首先,我们在walk方法中实现对data对象中的所有属性监听,如下:

p.walk = function(data){
 let keys = Object.keys(data);
 keys.forEach( key => {
 let val = data[key];
 this.convert(key, val);
 });
}

且,由于属性中可能又会是一个对象,那么,我们就有必要监听它们。

怎么办呢?

如果是个对象,再次利用Observer构造函数,处理它不就完了么。

如下:

p.walk = function(data){
 let keys = Object.keys(data);
 keys.forEach( key => {
 let val = data[key];
 //如果val为对象,则交给Observer处理
 if(typeof val === 'object'){
  Observer(val);
 }
 this.convert(key, val);
 });
}

你可能会有这样的疑问,如果直接利用Observer处理对象,那么不就与父对象失去关联了么?

然而并没有,因为JavaScript对于对象是指向地址关系,所以怎么会失去关联呢。

-convert-

对于convert方法,就比较简单了,一如既往就是利用Object.defineProperty监听数据,如下:

p.convert = function(key, val){
 Object.defineProperty(this.data, key, {
 get: ()=>{
  console.log('访问了'+key+' 值为'+val);
  return val;
 },
 set: (newVal)=>{
  console.log('设置了'+key+' 值为'+newVal);
  if(newVal !== val){
  val = newVal;
  }
 }
 });
}

好了,到此,一个简单的Observer就构造完成,下面我们就来测试下,是否成功监听了每个属性。

<script src="./observer.js"></script>
<script>
 let data = {
 user: {
  name: 'Monkey',
  age: 24
 },
 lover: {
  name: 'Dorie',
  age: 23
 }
 };
 Observer(data);
</script>

效果如下:

Vue数据驱动模拟实现2

Perfect,完整代码见github。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
newxtree.js代码
Mar 13 Javascript
JQuery判断HTML元素是否存在的两种解决方法
Dec 26 Javascript
JS实现简单的图书馆享元模式实例
Jun 30 Javascript
原生JavaScript实现滚动条效果
Mar 24 Javascript
深入浅析JS Function()构造函数
Aug 22 Javascript
微信小程序 loading 详解及实例代码
Nov 09 Javascript
JS字符串长度判断,超出进行自动截取的实例(支持中文)
Mar 06 Javascript
javascript数组拍平方法总结
Jan 20 Javascript
JavaScript链式调用实例浅析
Dec 19 Javascript
JS实现随机抽取三人
Nov 06 Javascript
vue-socket.io跨域问题有效解决方法
Feb 11 Javascript
基于VUE实现判断设备是PC还是移动端
Jul 03 Javascript
jQuery实现对象转为url参数的方法
Jan 11 #Javascript
将鼠标焦点定位到文本框最后(代码分享)
Jan 11 #Javascript
移动端界面的适配
Jan 11 #Javascript
bootstrapValidator bootstrap-select验证不可用的解决办法
Jan 11 #Javascript
HTML5 js实现拖拉上传文件功能
Nov 20 #Javascript
Bootstrap表单控件使用方法详解
Jan 11 #Javascript
老生常谈的跨域处理
Jan 11 #Javascript
You might like
Yii2创建控制器(createController)方法详解
2016/07/23 PHP
基于PHP实现短信验证码接口(容联运通讯)
2016/09/06 PHP
PHP使用curl函数发送Post请求的注意事项
2016/11/26 PHP
CodeIgniter框架数据库基本操作示例
2018/05/24 PHP
浅谈PHP进程管理
2019/03/08 PHP
window.onload 加载完毕的问题及解决方案(上)
2009/07/09 Javascript
jQuery1.5.1 animate方法源码阅读
2011/04/05 Javascript
javascript实现焦点滚动图效果 具体方法
2013/06/24 Javascript
在线一元二次方程计算器实例(方程计算器在线计算)
2013/12/22 Javascript
jQuery中:input选择器用法实例
2015/01/03 Javascript
JavaScript结合AJAX_stream实现流式显示
2015/01/08 Javascript
js实现简单的左右两边固定广告效果实例
2015/04/10 Javascript
ajax级联菜单实现方法实例分析
2016/11/28 Javascript
详解基于Node.js的微信JS-SDK后端接口实现代码
2017/07/15 Javascript
Vue+Element使用富文本编辑器的示例代码
2017/08/14 Javascript
JavaScript中使用Async实现异步控制
2017/08/15 Javascript
Redux 和 Mobx的选择问题:让你不再困惑!
2017/09/18 Javascript
bootstrap treeview 扩展addNode方法动态添加子节点的方法
2017/11/21 Javascript
JS运动特效之完美运动框架实例分析
2018/01/24 Javascript
react组件从搭建脚手架到在npm发布的步骤实现
2019/01/09 Javascript
从CentOS安装完成到生成词云python的实例
2017/12/01 Python
在python中使用requests 模拟浏览器发送请求数据的方法
2018/12/26 Python
对Python中 \r, \n, \r\n的彻底理解
2020/03/06 Python
python制作抽奖程序代码详解
2021/01/15 Python
英国最大的在线照明商店:Litecraft
2020/08/31 全球购物
财务管理专业毕业生求职信范文
2013/09/21 职场文书
员工培训邀请函
2014/02/02 职场文书
一位农村小子的自荐信
2014/04/07 职场文书
实习单位评语
2014/04/26 职场文书
本科生就业推荐信
2014/05/19 职场文书
副总经理党的群众路线教育实践活动个人对照检查材料思想汇报
2014/10/06 职场文书
嘉宾邀请函
2015/01/31 职场文书
小平您好观后感
2015/06/09 职场文书
工作后的感想
2015/08/07 职场文书
劳动合同变更协议书范本
2019/04/18 职场文书
珍惜时间的诗歌赏析
2019/08/23 职场文书