vue底层实现双向数据绑定的原理
01.Object.defineProperty()
Object.defineProperty()的作用就是直接在一个对象上定义一个新属性,或者修改一个已经存在的属性
Object.defineProperty(obj, prop, desc)
obj 需要定义属性的当前对象
prop 当前需要定义的属性名
desc 属性描述符
02.单向数据绑定
数据变,视图变
<body>
<h1 id="title"></h1>
<span id="btn">点击</span>
<script>
let book = {};
let name = "123";
Object.defineProperty(book,"name",{
set(value){
name=value
title.innerHTML=name;
},
get(value){
return name
}
})
let num=0;
btn.onclick=function(){
book.name=num++;
console.log(book.name)
}
</script>
</body>
03.双向数据绑定
视图变,数据变
<body>
<h1 id="title"></h1>
<span id="btn">点击</span>
<input type="" name="" id="test" value="" />
<script>
let book = {};
let name = "123";
Object.defineProperty(book,"name",{
set(value){
name=value
btn.innerHTML=name;
},
get(value){
return name
}
})
//通过oninput监听input的值变化
test.oninput=function(){
book.name=this.value;//进入set
console.log(name)//进入get
}
</script>
</body>
04.vue实现双向数据绑定原理
object有个方法叫Object.defineProperty,这个方法可以检测到属性的变化。一旦检测到数据变化就会通知dom更新。其实defineProperty做到了数据劫持,底层发布的时候使用了发布者订阅者模式