vue数据双向绑定是通过数据劫持结合发布者-订阅者模式的方式来实现的,vue2是通过Object.defineProperty()来实现数据劫持的,通过Object.defineProperty()方法来给数据添加set()和get()方法,set()来实现数据变化的消息发布,get()来实现对数据的变化消息的订阅,vue3通过Object.proxy方法实现。
<body>
<div>
输入姓名:<input id="input" type="text">
<h2 id="h2"></h2>
</div>
<script>
var obj = {name: ''}
var inputNode = document.getElementById('input')
var hNode = document.getElementById('h2')
console.log(obj)
Object.defineProperty(obj, 'name', {
get: function() {
console.log('调用了getter方法')
return hNode.innerText
},
set(val) {
console.log('调用了setter方法')
console.log(val)
inputNode.value = val
hNode.innerText = val
}
})
obj.name = '张三'
inputNode.addEventListener('input', function() {
obj.name = this.value
})
class Test {
num
set number(val) {
this.num = val
}
get number() {
return this.num
}
}
var test = new Test()
console.log(test.number)
test.number = 12000
console.log(test.number)
</script>