网上一堆所谓的面试题说的vue的双向数据绑定是Object.defineProperty实现的,啊对对对,说的没错,然后呢?没了????我丢,老子还以为真的就这么一句话可以了。
遇到这个问题,我当时的回答是通过Object.defineProperty()去监听对象的某个属性,当其被读取或者写入新数据的时候就会触发Object.defineProperty()的get和set方法,然后面试官就问了一句,还有吗。
还有吗,我不知道啊,我所看过的教程啥的都只讲到这
最近才刚看到另外的教程,还没看完,先写一部分出来吧。
上面的回答没错,但是不够完善。
我们在vm.data中赋值了数据之后,会调用initData方法,在initData中会将data的值拿去循环调用一个proxy代理,在这个代理中,我们会把原本访问的vm.data通过object.defineProperty()变成访问vm._data
就是在赋值vm.data的同时,也将vm.data的值赋值给vm._data,然后再用for循环给vm.data给绑定上Object.defineProperty,在这个Object.defineProperty中改变我们的读写对象,也就是在Object.defineProperty中的set操作中把vm.data赋值给了vm._data,又在get操作中把vm._data返回了出来。
例如我们访问的是vm.msg,但实际上我们读取的对象属性都是vm._data.msg;