Vue 数据代理(Day6)

37 阅读1分钟

Object.defineProperty方法回顾

添加的属性不可枚举(不可遍历)

传三个参数 要添加属性的对象名,需添加的属性名,配置项

let number = 18;

      let person = {

        name: "张三",

        sex: "男",

      };

      Object.defineProperty(person, "address", {

        value: "北京",

        enumerable: true, //控制属性是否可枚举,默认值为false

        writable: true, //控制添加的属性是否可修改,默认值为false

        configurable: true, //控制添加的属性是否可删除,默认值为false

      });

      console.log(Object.keys(person));

      Object.defineProperty(person, "age", {

        // 当person属性中的age值被读取时,会调用get函数,且该函数的返回值即age的值

        get() {

          console.log("age值被读取了");

          return number;

        },

        // 当person属性中的age值被修改时,会调用set函数,且会收到修改的具体值

        set(value) {

          console.log("age值被修改了", value);

          number = value;

        },

      });

      console.log("person", person);

理解数据代理

数据代理定义: 通过一个对象代理对另一个对象中的属性进行操作(读/写)

     let obj1 = { x: 100 };

     let obj2 = { y: 200 };

       Object.defineProperty(obj2,'x',{

           get(){

               return obj1.x

           },

           set(value){

               obj1.x=value

           }

       })

Vue中的数据代理

1、定义:通过vm对象来代理data对象中的属性操作(读/写)

2、好处:更加方便的操作data中的数据

3、基本原理

            1、通过Object.defineProperty()把data中的全部属性添加到vm实例上

            2、为每一个添加到vm上的属性都指定一个getter/setter

            3、在getter/setter内部去操作(读/写)data中对应的属性