vue2和vue3响应式原理


1、vue2 响应式原理

       //源数据
        let person = {
            name: '张三',
            age: 10
        }
        //vue2中响应式
        //#region
         let p = {};
         给p加了个name属性,值是undefined
         Object.defineProperty(p, 'name', {}) 

         Object.defineProperty(p, 'name', {
            configurable: true,
             //只要读取name属性就会触发get方法
             get() {
                 console.log('我得到了');
                 return person.name
             },
             //只要修改name属性就能触发set方法
             set(value) {
                 console.log('有人修改了name属性');
                 person.name = value
             }
         })
        //这种用Object.defineProperty添加新的属性和删除已有的属性就是不响应式的了
        //#endregion

2、vue3 响应式

//vue3响应式
        // window.Proxy window内置的构造函数,不用下载不用安装
        // let p=new Proxy(代理的源对象,{})
        // let p = new Proxy(person, {}) //把p映射到person对象上面,做到响应。console.log(p)可以看到效果
        let p = new Proxy(person, {
            get(target, propName) {
                console.log('读取了p的属性');
                return target[propName]
            },
            set(target, propName, value) {
                console.log('修改或者添加了p的属性');
                return target[propName] = value;
            },
            deleteProperty(target, propName) {
                console.log('执行了删除操作');
                return delete target[propName];
            }
        })

但是vue3底层是用 Reflect