原理:通过vm对象来代理 Vue 中我们自己定义在data中的数据,
首先: 我们自己定义的data中的对象或者属性 都会存储到vm中的_data 中进行数据劫持
其次: 通过Object.defineProperty() 方法的getter 和  setter  将_data中的数据设置到vm本身,从而更方便去使用

学习  Object.defineProperty()    话不多说直接上图

 1 <template>
 2   <div class="home">
 3   </div>
 4 </template>
 5 
 6 <script>
 7 // @ is an alias to /src
 8 
 9 export default {
10   name: 'DefinePropoty',
11   components: {
12   },
13   mounted () {
14     var that = this
15     Object.defineProperty(this.person, 'age', {
16       value: 'boy', // 设置值
17       enumerable: true, // 可遍历
18       writable: true, // 是否可以被修改
19       configurable: true, // 控制是否可以被删除
20       // 当有人读取age的属性的时候  get就会呗调用   且get的返回值是age的值
21       get () {
22         return that.number
23       },
24       // 当有人修改age属性的时候 触发  且参数为修改的值
25       set (val) {
26         that.number = val
27       }
28     })
29     // this.$delete(this.person, 'sex')  删除对象的属性
30     // 访问age
31     console.log(this.person.age)
32     // 修改age
33     this.person.age = 666
34   },
35   data () {
36     return {
37       number: 20,
38       person: {
39         name: 'GQ',
40         sex: '男',
41         age: this.number
42       }
43     }
44   }
45 }
46 </script>

 

实例  : 通过 obj2代理obj1     

 1 <template>
 2   <div>
 3     <!-- 数据代理   修改一个对象的某个属性另外一个对象也随之改变 -->
 4   </div>
 5 </template>
 6 
 7 <script>
 8 export default {
 9   name: 'DataMange',
10   mounted () {
11     var that = this
12     // 给obj2添加一个x属性   有人读取就返
13     Object.defineProperty(this.obj2, 'x', {
14       // 有人读取obj2 的x就把obj1的X给他
15       get () {
16         return that.obj1.x
17       },
18       //   有人修改obj2的x就把obj1的x也修改
19       set (val) {
20         that.obj1.x = val
21       }
22     })
23     console.log(that.obj2.x)
24     that.obj2.x = 6666
25     console.log(that.obj1.x)
26   },
27   data () {
28     return {
29       obj1: {
30         x: 66
31       },
32       obj2: {
33         y: 888
34       }
35     }
36   }
37 }
38 </script>
39 
40 <style lang="scss" scoped>
41 </style>