文章插图
我们虽然添加的是age,但是这里的意思是将原有属性age覆盖掉 , 使用这个新的age
我们来看下测试结果
文章插图
出现bug的原因
- 其实这个问题很好理解,我们看下错误原因
文章插图
- 这是一个 无限递归产生的bug , 该方法一直无限的被调用,从而产生了这个错误
- 为什么呢?
- 我们仔细看下这段代码
文章插图
- 当,age属性被访问的时候,会调用get函数
- 调用get函数,会返回age
- 返回的过程当中,age是不是又被访问了
- 从而产生死循环,无限递归
- 为什么无法修改属性呢?也是这个道理
Observer
- 在vue当中,有个接口叫做Observer , 这个接口用来监视页面数据发生的变化
- 不过他底层是如何进行监听的呢
- 我们写不到底层那么详细 , 只写主要的部分
文章插图
2、我们创建一个function ==> Observer
文章插图
然后实例化这个 Observer , js当中,function是可以当做构造函数使用的
文章插图
该函数需要一个属性,从参数名可以看出,这是一个对象属性
3、现在我们就来配置这个对象,首先我们需要获取到 data这个对象当中的所有key值
文章插图
4、对这个数组,进行循环
文章插图
5、在迭代的过程当中,使用definedProperty进行数据代理
文章插图
参数解析,为什么这里,添加数据的对象(参数1) 是 this?
- 使用this,那么就是给 this所指向的对象 ==> Observer;也就是我们刚刚实例化出来的对象
文章插图
- 给它添加属性(property参数)
- 那么接下来我们就在 参数三 当中配置get和set了
文章插图
数组当中是可以用字符串来获取元素值的(很少)
完整代码
// 这有一个对象,对象有两个属性let data = https://www.huyubaike.com/biancheng/{name:"waves",age: 0}// 实例化一个监视器对象let observer = new Observer(data);// 监视对象Observerfunction Observer(obj){// 1、获取data当中的所有key值let properties = Object.keys(data); // ["name","age"]// 2、迭代 properties数组properties.forEach((property)=>{// 3、在迭代的过程当中,使用definedProperty进行数据代理Object.defineProperty(this,property,{// 配置get和setget(){// 很简单,因为data没有做数据代理,返回data[property]即可return data[property]; // data["name"] = waves},set(val){// 赋值即可data[property] = val}})})}
总结- 我们这里设置了一个data
文章插图
- 通过我们的一系列配置,data身上有的属性,Observer实例身上也有
- 并且,这个observer身上的属性都做了数据代理
- 当然,vue写的比我们完善的多
- 比如,如果data当中还存在对象怎么办?
文章插图
vue在这里写了递归,一直找,找到这个属性不再是对象为止
文章插图
数组也是一个道理,vue也能给你找出来,不过 关于数组和对象的代理,这二者的处理方式不同,下节会讲解
推荐阅读
- 简笔画如何画漫画羊(简笔画羊的画法大全简单)
- 简单的绵羊怎么画(如何画简单的绵羊)
- 如何快速高效地煲耳机(自然煲耳机方法)
- 蓝牙耳机如何煲机(新耳机要如何正确煲机)
- 如何煲机,煲耳机有什么方法(耳机最科学的煲机方法)
- 如何在.NET程序崩溃时自动创建Dump?
- 华为蓝牙耳机如何煲机(华为蓝牙耳机煲机歌单)
- 网络不稳定老是掉线怎么办(网络不稳定如何解决)
- 怎么看主板型号(如何看电脑主板型号)
- 优雅的写好Vue项目代码 — 路由拆分、Vuex模块拆分、element按需加载