理解Vue中的数据代理/数据劫持

理解数据代理:

1.数据代理是什么。

数据代理的实质是一个对象代理可以对另一个对象的属性操作(读/写) 这里提到了一个对象代理可以对另一个对象属性进行操作得提到一个api Object.defineProperty()。

数据代理的底层是基于Object.defineProperty()方法

Object.defineProperty():本质是往对象身上添加一个定义属性。可以传三个参数:

1.要添加的对象名称

2.要添加对象的属性

3.配置对象的方法

通过案例演示 Object.defineProperty()

a9be696dd08c0feff4be67db4495d040.png

9173f48a41fe4c290231a1909d46fc6b.png

这时有人会问 控制台name和sex的颜色与age颜色不同 

这时有三个配置项:

1.所配置的对象属性是否可枚举

   enumerable: true; 默认值为false

  2.所配置的对象属性是否可修改

   writable: true;  默认值为false

 3.所配置的对象属性是否可删除

  configurable: true;  默认值为false

来看案例演示

ed445d8587cfa6494e8adbf5a5268a16.png

这时我们看到person对象里已经有age属性 接下来通过案例演示三个配置项 age属性是可被枚举

be45afcd97d904c29926b8e621d74a66.png

还有两个配置项修改与删除

0916e707f46419a8167bc998a07bd0d4.png

看到控制台已经修改成功 person对象里的age值也发生了改变

fd3480f0ea9926717f63d39011f0f13d.png

看到控制台已经删除了name属性 person对象里只有sex和age属性

通过这三个配置项 Object.defineProperty里还有两个更高级的配置项 来操作数据代理 全称是getter与setter这两个配置项 简写形式get和set

案例演示

c0b81ed085cd0176d7a6d90cd8e48a14.png

临时声明了一个变量number值为18

通过get()函数 当有人读取了age属性 get就会被调用 所返回的值是age值

代码演示get和set

1f0e513dafbc9af60512ea516bf77f1a.png

通过get()函数 当有人修改了age属性 set就会被调用 所返回的是具体值

0f50080157daf81b9575eb384ee9b01c.png

当修改了age值 person里的值没有改变 这是什么原因:因为没有把修改最新的值赋值给age 所以要在set(value) 加上这个参数

addf1d40cb47eac5a65b0807fa96ef50.png

3b92f3ebb0963e554b12aeb2fdd0c53a.png

这时我们看到已经修改成功了 有人好奇为啥age括号是三个点: 可以看到get和set所服务的是age属性 是个函数 点age括号里的三个点会看到是18 这里会在数据代理里讲清楚这个点

af261019c266b00923a73fe3f7c75f6f.png

通过这个案例初步可以理解什么是数据代理 只要有人读取或者修改属性的值会发生变化

通过一个案例更清楚的理解什么是数据代理

c9df20d213cf0c57d8b9c0680da9e81f.png

向obj2对象身上添加一个x属性

当有人读取了obj.x 就返回所对应的值

e25103f875965dbfd7de64a5bf204ea7.png

当有人修改了obj.x 就返回所修改的值 

c47bc36df562e6dd0c2b808c9ae31d1f.png

这里有个疑问 obj2.x的值被修改了 obj.x的也随着obj2.x修改了 这里可以看到有人读取了obj2.x 返回的是obj里的x值100 这也会伴随着修改obj2.x obj.x也会修改 这就是一个对象代理可以对另一个对象的属性进行操作(读/写)

现在开始数据代理正题:数据代理对Vue有什么作用

9be49f0502cdec4d85dbe16e48cf0441.png

00414ea7f5f7edf33ccfcb7252d7d1dd.png

这时页面上呈现的是data中的数据

3a2793d58711d74b7336a0bbd225c2c0.png

我们要验证两条线get和set是如何工作的

当然get这条线比较容易验证

代码演示

e7bca11571e68920ce47800dee6d2696.png

 当访问了name和age getter就被调用 把data中的name和age打印出来 当我们在编辑器中概name的值

ac013b9ab0a950e2ce9807dbda4808a2.png

8f0d17efdf0b351ce539b024d509f7c1.png

从此可以看出data中的数据发生改变 控制台输出的data数据也随之改变

验证set这条线 

38ae4621de971cca9be00eac4d4ad597.png

这时我们可以看一个存在问题:不存在  此时在vm不叫data 而是_data

当我们访问_data 是否会有name和age属性

案例演示

d0fee3c2b545a30f650ed6f019c6e0dc.png

此时可以看到控制台输出的结果是data中的数据 由此可以验证下data是否等于data

7698028df4b5d43cf0b6332c8bc2b89c.png

此时控制台输出data未定义 这时有个简单的办法 把data定义出去

6ad5d42833c1b78bc12139a4ed91effb.png

1b13c8590135d57b38df880615ca25ac.png

此时控制台输出为true 由此可以验证出_data就是data 只不过vm中不叫data 可以验证一个option

ae5196e26233b68530aa3eab470984b5.png

0a1079f882ffe59b440b3523579d9f2b.png

这条也可以验证出来 option这个函数也有age和name

aa6e14c0c8cf66e1050589a7c66d7815.png

此时可以看出_data里也有name和age属性 有get和set 当然这里是Vue做的一个数据劫持 如果没有数据代理 就要输出vm._data.name 有数据劫持就只需要vm.name就能访问以及修改

数据代理(重点)

首先vm中有data{name:'张三',age:18} data把里面的name和age给到了_data 而_data 一份给到了vm 一份又在_data下面放name和age 如果有人读取name getter开始工作 准备把data中的name给下面的name 如果有人修改name setter开始工作准备把data中修改name的值给到下面的name

由此可以验证 只要有人修改了name属性 页面就立即响应数据 这里要提到一点 当data中的数据发生改变 Vue监测到了进行响应

f53c2aee5b53928ba7607ee138d0ba6e.png

数据代理对Vue的作用:其实很好理解:数据代理代理的是data中的数据是否发生变化 只要变化 被Vue监测到 页面就立即刷新 如果data中没有此数据 Vue监测不到 页面不会刷新 控制台也不会报错。

这是我对Vue中数据代理的理解过程 也希望能帮助一些在学Vue中数据代理对这个不了解的同学。

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值