Vue中的双向数据绑定原理
- 利用ES5中的 object.defineProperty() 方法来实现,它是ES5中无法shim(兼容)的特性,所以Vue不支持IE8以及更低版本浏览器。
- object.defineProperty() 方法 可以用来给 对象添加属性 ,与一般的 对象添加属性 不同的是,它可以对添加的属性加些修饰,而双向数据绑定的原理利用了:getter / setter
//一般的 给对象添加属性:
var obj = {};
obj.name = 'jack';
console.log(obj);
- get 的使用:
//object.defineProperty() 方法 给对象添加属性:
var obj = {};
object.defineProperty(obj,'msg',{
get: function () {
//当访问对象属性的时候,这个方法会执行!!!
console.log('对象的msg属性被访问了~');
},
set: function () {
//当设置对象属性法时候,这个方法会执行!!!
}
})
console.log(obj.msg);
![](https://img.haomeiwen.com/i9680443/574b8ddb86dd6ae3.png)
一般 get 是返回某个具体的值;
- set 的使用:
//object.defineProperty() 方法 给对象添加属性:
var obj = {};
object.defineProperty(obj,'msg',{
get: function () {
//当访问对象属性的时候,这个方法会执行!!!
console.log('对象的msg属性被访问了~');
return this._msg;
},
set: function (val) {
//当设置对象属性法时候,这个方法会执行!!!
console.log('给对象设置了msg属性~')
this._msg = val;
}
})
console.log(obj.msg);
![](https://img.haomeiwen.com/i9680443/c529be0984949767.png)
object.defineProperty() 方法 的其他描述:
- configurable:默认为false,当且仅当该属性的configurable 为 true 时,该属性
描述符
才能够被改变。- enumerable:默认为 false,当且仅当该属性的enumerable 为true 时,该属性才能出现在对象的枚举属性中。
- value:默认为undefined,表示该属性的值,可以是任何有效的javascript值(数值,对象,函数等)。
- writeable:默认为false,当且仅当该属性的writeable值为true时,该属性才能够被
赋值运算符
改变。
Vue双向数据绑定原理的模拟实现:
<div id="app">
<input type="text" id="txt">
<h1 id="h1"></h1>
</div>
<script>
var txt = document.getElementById('txt'),
h1 = document.getElementById('h1');
var data = {};
Object.defineProperty(data,'msg',{
set: function(val){
h1.innertext = val;
}
})
txt.addEventListener('keyup',function(){
data.msg = txt.value;
})
</script>
结果表示:
![](https://img.haomeiwen.com/i9680443/86143a07de170b80.png)
Vue执行过程(双向数据绑定的原理分析):
1、根据传入的 el 配置项,找到页面中需要被Vue管理的内容区域;
2、遍历所有的后代元素,收集出现的所有指令(v-model)和表达式({{ }})(mustache);
3、遍历传入 data 中的数据,分别通过 Object.defineProperty() 实现每个数据的 get/set;
4、每个数据的 get 和 set 中,分别与页面中使用该数据的指令和表达式对应起来;
5、将来当数据改变的时候,通过 设定好的 get,将数据的变化同步到页面中;
网友评论