最近两次面试的时候,被问到了vue中双向数据绑定的原理,由于初学不精,只是使用而没有深刻研究,因此答不出来。以后就在网上查找了别人写的博客,学习一下。css
下面是博客园一篇博客,以及MDN上讲解Object.defineProperty()方法的地址。html
文章连接:vue的双向绑定原理及实现
Mozilla 开发者服务:Object.defineProperty()vue
由于内容比较长,就不转载了,只贴个链接在这里,有兴趣的能够直接点击连接访问。面试
这里简单说一下我的的理解。markdown
vue实现双向数据绑定的原理就是利用了 Object.defineProperty() 这个方法从新定义了对象获取属性值(get)和设置属性值(set)的操做来实现的。学习
在MDN上对该方法的说明是:Object.defineProperty() 方法会直接在一个对象上定义一个新属性,或者修改一个对象的现有属性, 并返回这个对象。ui
它接收三个参数,要操做的对象,要定义或修改的对象属性名,属性描述符。重点就是最后的属性描述符。spa
属性描述符是一个对象,主要有两种形式:数据描述符和存取描述符。这两种对象只能选择一种使用,不能混合两种描述符的属性同时使用。上面说的get和set就是属于存取描述符对象的属性。.net
而后咱们能够经过在存取描述符中的get和set方法内写入自定义的逻辑来实现对象获取属性和设置属性时的行为。双向绑定
var keyValue = 1;
var obj = {};
Object.defineProperty(obj,'key', {
enumerable: true,
configurable: true,
get: function(){
return keyValue;
},
set: function(newValue){
keyValue = newValue;
console.log(`keyValue的值已发生改变,目前的值是:${keyValue}`);
}
});
obj.key; // 1
obj.key = 'obj对象的key属性已经绑定了变量keyValue的值';
// keyValue的值已发生改变,目前的值是:obj对象的key属性已经绑定了变量keyValue的值
// "obj对象的key属性已经绑定了变量keyValue的值"
keyValue; // "obj对象的key属性已经绑定了变量keyValue的值"
上面这个例子就是改变了对象获取属性及设置属性的默认行为。
对象obj获取属性key的值时,会触发上面的get方法,获得的是变量keyValue的值,而后当从新设置key的值时,触发set方法,会将变量keyValue的值改变为设置的值,如此就实现了一个简单的双向绑定:改变keyValue,obj.key获得的值也会改变,从新设置obj.key,keyValue同样会随之改变。
固然,vue的双向绑定实际更复杂,但最基本的原理就是基于Object.defineProperty()方法改变数据存取的默认行为来实现的。