一、前言

在随笔“模拟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数据驱动原理
# 好了
# 创建一个
# 是个
# 就来
# 值为
# 象中
# 是一个
# 这一
# 会有
# 又是
# 他是
# 就有
# 遍历
# 说到
# 不就
# 今儿
# 又会
# 我们一起
# 到此
# 来完成
相关文章:
专业网站设计制作公司,如何制作一个企业网站,建设网站的基本步骤有哪些?
建站之星如何配置系统实现高效建站?
家具网站制作软件,家具厂怎么跑业务?
定制建站模板如何实现SEO优化与智能系统配置?18字教程
开心动漫网站制作软件下载,十分开心动画为何停播?
图片制作网站免费软件,有没有免费的网站或软件可以将图片批量转为A4大小的pdf?
高防网站服务器:DDoS防御与BGP线路的AI智能防护方案
,网页ppt怎么弄成自己的ppt?
公司网站制作需要多少钱,找人做公司网站需要多少钱?
实例解析angularjs的filter过滤器
如何用美橙互联一键搭建多站合一网站?
内部网站制作流程,如何建立公司内部网站?
佛山网站制作系统,佛山企业变更地址网上办理步骤?
javascript中的try catch异常捕获机制用法分析
湖北网站制作公司有哪些,湖北清能集团官网?
制作国外网站的软件,国外有哪些比较优质的网站推荐?
黑客入侵网站服务器的常见手法有哪些?
图册素材网站设计制作软件,图册的导出方式有几种?
简单实现Android验证码
郑州企业网站制作公司,郑州招聘网站有哪些?
如何高效配置IIS服务器搭建网站?
北京制作网站的公司,北京铁路集团官方网站?
建站之星安装后如何配置SEO及设计样式?
建站主机选哪家性价比最高?
天津个人网站制作公司,天津网约车驾驶员从业资格证官网?
如何获取上海专业网站定制建站电话?
制作网站的软件下载免费,今日头条开宝箱老是需要下载怎么回事?
南京做网站制作公司,南京哈发网络有限公司,公司怎么样,做网页美工DIV+CSS待遇怎么样?
北京营销型网站制作公司,可以用python做一个营销推广网站吗?
建站主机空间推荐 高性价比配置与快速部署方案解析
如何配置FTP站点权限与安全设置?
如何打造高效商业网站?建站目的决定转化率
c++怎么使用类型萃取type_traits_c++ 模板元编程类型判断【方法】
建站主机如何选?高性价比方案全解析
建站OpenVZ教程与优化策略:配置指南与性能提升
大连网站制作公司哪家好一点,大连买房网站哪个好?
如何在服务器上配置二级域名建站?
如何快速搭建高效服务器建站系统?
如何快速选择适合个人网站的云服务器配置?
制作网站公司那家好,网络公司是做什么的?
如何在腾讯云免费申请建站?
如何快速生成橙子建站落地页链接?
实例解析Array和String方法
网站制作外包价格怎么算,招聘网站上写的“外包”是什么意思?
微信小程序 input输入框控件详解及实例(多种示例)
家庭建站与云服务器建站,如何选择更优?
网站制作与设计教程,如何制作一个企业网站,建设网站的基本步骤有哪些?
如何快速搭建支持数据库操作的智能建站平台?
如何快速完成中国万网建站详细流程?
,制作一个手机app网站要多少钱?
*请认真填写需求信息,我们会在24小时内与您取得联系。