Object.defineProperty方法
Vue.js底层的数据劫持、数据代理、计算属性都用到了该方法。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
| <script> let number = 18 let person = { name: '张三', sex: '男' } Object.defineProperty(person,'age',{ get(){ return number }, set(value){ number = value } })
console.log(Object.keys(person)) console.log(person) </script>
|
get方法

set方法

数据代理
通过一个对象代理对另一个对象中属性的操作(读/写)
1 2 3 4 5 6 7 8 9 10 11 12
| <script> let obj = {x:12} let obj2 = {y:14} Object.defineProperty(obj2,'x',{ get(){ return obj.x }, set(value){ obj.x = value } }) </script>
|

Vue中的数据代理
1.通过vm对象来代理data对象中属性的操作(读/写)
2.好处:更加方便地操作data中的数据
3.基本原理:
- 通过Object.defineProperty()把data对象中所有属性添加到vm上。
- 为每一个添加到vm上的属性,都指定一个getter/setter方法
- 在getter/setter内部去操作(读/写)data中相应的属性

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| <body> <div id="app"> 学校:{{school}} 地址:{{address}} </div> </body> <script type="text/javascript"> let data = { school: 'zz', address: 'aa' } const vm = new Vue({ el: '#app', data }) </script>
|

