当你把一个普通的 JavaScript 对象传入 Vue 实例作为 data 选项,Vue 将遍历此对象所有的属性,并使用 Object.defineProperty 把这些属性全部转为 getter/setter。Object.defineProperty 是 ES5 中一个无法 shim 的特性,这也就是 Vue 不支持 IE8 以及更低版本浏览器的原因。
<script>
// 定义一个空对象
let data = {}
// 给 data 设置一个 message 属性,并设置 get 和 set 的回调
Object.defineProperty(data,"message",{
// 获取数据
get(){
console.log('get触发了')
return message
},
// 设置数据
set(newVal){
console.log('set触发了')
message = newVal
}
})
</script>
<input type="text" v-model>
<h2 v-text></h2>
<h2 v-text></h2>
<h2 v-text></h2>
<h2 v-text></h2>
<h2 v-text></h2>
<h2 v-text></h2>
<h2 v-text></h2>
<script>
let data = {}
Object.defineProperty(data,"message",{
// 获取数据
get(){
console.log('get触发了')
return message
},
// 设置数据
set(newVal){
console.log('set触发了')
message = newVal
// 获取所有的 v-text 属性的标签动态赋值
let arr = document.querySelectorAll('[v-text]');
arr.forEach(item=>{
item.innerText = data.message
})
// 给 input 标签动态赋值
document.querySelector('[v-model]').value = data.message
}
})
// 输入事件触发的时候,调用 set 方法来实现双向绑定
document.querySelector('[v-model]').oninput=function(){
data.message = this.value
}
</script>