最近想了解一下Vue是怎么实现数据双向绑定的,了解到是基于Object.definProperty,在此记录一下。javascript
Object.defineProperty 顾名思义,就是给对象定义一个属性,总共有这么几种:java
不能同时设置访问器 (get 和 set) 和 wriable 或 value,不然会错,就是说(get 和 set)和(wriable 或 value中的任何一个)只能取其一this
随便写点东西spa
<script> var c = { year:2017 }; Object.defineProperty(c,'a',{
// 注意这里不能直接不能对a直接赋值,不然会无限回调 set:function(val){console.log(`I set the value ${val}`);}, get:function(){return this} }) </script>
分别赋值和取值:双向绑定
set的时候正确的调用了方法,可是取值的时候若是写return this.acode
就会报错,栈溢出。看上面的图咱们就明白了,a的值指向自身,若是直接打印就会无限回调,虽然咱们不能取到a,但咱们能经过a取到其余属性对象
修改get:blog
set:function(val){ this.year = val }, get:function(e){ return this.year }