一、前言

在随笔“模拟Vue之数据驱动1”结尾处,我们说到如果监听的属性是个对象呢?那么这个对象中的其他属性岂不就是监听不了了吗?
如下:
倘若user中的name、age属性变化,如何知道它们变化了呢?
今儿,就来解决这一问题。
通过走读Vue源码,发现他是利用Observer构造函数为每个对象创建一个Observer对象,来监听数据的,如果数据中的属性又是一个对象,那么就又通过Observer来监听嘛。
其实,核心思想就是树的先序遍历(关于树,可参考here)。如我们将上述Demo中的data数据,图形化一下,就更加明白了,如下:
好了,理清了大体思路,下面我们就一起来创建一个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>
效果如下:
Perfect,完整代码见github。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
# Vue
# 数据驱动
# Vue数据驱动表单渲染
# 轻松搞定form表单
# 浅谈vuejs实现数据驱动视图原理
# 详解VueJS 数据驱动和依赖追踪分析
# Vue数据驱动模拟实现5
# Vue数据驱动模拟实现4
# Vue数据驱动模拟实现1
# Vue数据驱动模拟实现3
# 详解Vue数据驱动原理
# 好了
# 创建一个
# 是个
# 就来
# 值为
# 象中
# 是一个
# 这一
# 会有
# 又是
# 他是
# 就有
# 遍历
# 说到
# 不就
# 今儿
# 又会
# 我们一起
# 到此
# 来完成
相关文章:
建站之星安装后如何自定义网站颜色与字体?
建站之星CMS建站配置指南:模板选择与SEO优化技巧
关于BootStrap modal 在IOS9中不能弹出的解决方法(IOS 9 bootstrap modal ios 9 noticework)
建站之星logo尺寸如何设置最合适?
武汉外贸网站制作公司,现在武汉外贸前景怎么样啊?
宝塔建站后网页无法访问如何解决?
独立制作一个网站多少钱,建立网站需要花多少钱?
建站之星代理如何优化在线客服效率?
如何登录建站主机?访问步骤全解析
建站之星在线版空间:自助建站+智能模板一键生成方案
昆明高端网站制作公司,昆明公租房申请网上登录入口?
大连企业网站制作公司,大连2025企业社保缴费网上缴费流程?
高防网站服务器:DDoS防御与BGP线路的AI智能防护方案
如何用西部建站助手快速创建专业网站?
寿县云建站:智能SEO优化与多行业模板快速上线指南
网站制作多少钱一个,建一个论坛网站大约需要多少钱?
如何在Golang中实现微服务服务拆分_Golang微服务拆分与接口管理方法
深圳防火门网站制作公司,深圳中天明防火门怎么编码?
网站制作的步骤包括,正确网址格式怎么写?
公司门户网站制作公司有哪些,怎样使用wordpress制作一个企业网站?
大学网站设计制作软件有哪些,如何将网站制作成自己app?
常州企业建站如何选择最佳模板?
开封网站制作公司,网络用语开封是什么意思?
南阳网站制作公司推荐,小学电子版试卷去哪里找资源好?
相亲简历制作网站推荐大全,新相亲大会主持人小萍萍资料?
如何通过二级域名建站提升品牌影响力?
如何选购建站域名与空间?自助平台全解析
教育培训网站制作流程,请问edu教育网站的域名怎么申请?
宝塔Windows建站如何避免显示默认IIS页面?
制作无缝贴图网站有哪些,3dmax无缝贴图怎么调?
如何选择域名并搭建高效网站?
建站上传速度慢?如何优化加速网站加载效率?
如何解决ASP生成WAP建站中文乱码问题?
ppt制作免费网站有哪些,ppt模板免费下载网站?
网站制作大概多少钱一个,做一个平台网站大概多少钱?
如何在宝塔面板中创建新站点?
如何在万网自助建站中设置域名及备案?
实例解析Array和String方法
建站之星上传入口如何快速找到?
黑客入侵网站服务器的常见手法有哪些?
上海制作企业网站有哪些,上海有哪些网站可以让企业免费发布招聘信息?
微课制作网站有哪些,微课网怎么进?
临沂网站制作企业,临沂第三中学官方网站?
建站主机服务器选型指南与性能优化方案解析
建站主机类型有哪些?如何正确选型
淘宝制作网站有哪些,淘宝网官网主页?
,制作一个手机app网站要多少钱?
大连网站设计制作招聘信息,大连投诉网站有哪些?
定制建站策划方案_专业建站与网站建设方案一站式指南
建站之星图片链接生成指南:自助建站与智能设计教程
*请认真填写需求信息,我们会在24小时内与您取得联系。