Vue的数据响应式 
数据响应式,顾名思义,Vue会在数据改变时做出响应,更新页面、执行函数等等,这便是Vue的数据响应式。
Vue通过监听observe和代理proxy实现数据响应式。
代理proxy 
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 let  data1 = proxy ({ data :{n :0 } }) function  proxy ({data} ){const  obj = {}Object .defineProperty (obj, 'n' , { get (return  data.n set (value ){if (value<0 )return  n  = valuereturn  obj console .log (`data1:${data1.n} ` ) n  = -1 console .log (`data1:${data1.n} ,设置为 -1 失败` ) n  = 1 console .log (`data1:${data1.n} ,设置为 1 成功` ) 
通过代理obj来操作数据,可以给数据加上一定的限制条件。 
代理不会改变原有对象。(房东找个中介,中介并不会动房子里的东西)
监听observe 
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 29 30 31 32 33 34 35 36 37 38 39 let  myData = {n :0 }let  data2 = proxy2 ({ data :myData }) function  proxy2 ({data} ){let  value = data.n Object .defineProperty (data, 'n' , {get (return  valueset (newValue ){if (newValue<0 )return const  obj = {}Object .defineProperty (obj, 'n' , {get (return  data.n set (value ){if (value<0 )return n  = valuereturn  obj console .log (`n:${data2.n} ` ) n  = -1 console .log (`n:${data2.n} ,设置为 -1 失败了` ) n  = 1 console .log (`n:${data2.n} ,设置为 1 成功了` ) 
通过监听,使得直接操作对象的n也能被察觉 
监听会改变原有对象。(房东的房子会被中介装摄像头、窃听器,改变了房屋)
监听先将原对象的n保存了下来,然后用getter&setter替换了n的值。
Vue.set & this.$set 
若对象新增了key,那么Vue可以通过Vue.set和this.$set为新key创建代理和监听
1 2 3 4 5 6 7 8 Vue .set (vm.someObject , 'b' , 2 )this .$set(this .someObject ,'b' ,2 )this .someObject  = Object .assign ({}, this .someObject , { a : 1 , b : 2  })
对于数组 
Vue使用了变更方法Mutation Methods 
Vue 将被监听的数组的部分方法进行了包裹,所以它们也将会触发视图更新 。这些被包裹过的方法包括:
push()
 
pop()
 
shift()
 
unshift()
 
splice()
 
sort()
 
reverse()
 
 
可以看到,进入Vue的数组的__proto__被Vue用变更方法替代了,原来关于Array的__proto__被放到了数组的原型的原型中。