vue数据劫持原理

在vue生命周期中的 created阶段,data中声明的数据,都会被getter/setter劫持并赋值到this组件实例上面,这也是在其他组件,如计算属性compute,方法methods,侦听器watch中能够直接使用this.数据而不是data.数据的原因;

原理:
利用Object.defineProperty()方法对数据进行处理:

Object.defineProperty():可以 定义新属性或修改原有的属性;
在操作vue数据之前,先来操作一个对象中的数据来进行体验:

目的是令obj中data中的数据可以直接通过obj.属性名进行读取和修改

 let obj = {
            data: {
                a: 1,
                b: 2,
                c: 3
            }
        }
        //遍历obj.data中的数据
        for (var key in obj.data) {
            let val = obj.data[key]
            //obj为要在上面定义属性的对象
            //key为要定义或修改的属性的名称
            //这里第三个参数是一个对象,在里面对val进行处理
            Object.defineProperty(obj, key, {
                //数据允许删除这个属性
                configurable: true,
                //数据允许被遍历
                enumerable: true,
                get() {
                    console.log('执行了get函数');
                    //将val return出去后,obj上面就有了val的值,键为key,也就是obj.data中的键名
                    return val
                },
                //当obj中的数据被修改之后,就会执行set函数,然后将数据修改
                set(newVal) {
                    console.log('执行了set函数', newVal);
                    val = newVal
                }
            })
        }

结果:
在这里插入图片描述
可以看到输入obj之后,里面的属性名a,b,c都进行了提示
数据也可以进行访问:
在这里插入图片描述
接下来进行数据的修改:
在这里插入图片描述
可以看到数据通过obj.b直接进行了修改,并且再次读取obj.b中的值时,值也变成了520;

回到Vue的数据劫持中,原理其实相同,在vue生命周期中的 created阶段,data中声明的数据,都会被getter/setter劫持并赋值到this组件实例上面;
所以可以通过vue实例对象中的this来读取或修改数据;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值