原理
vue.js 则是采用数据劫持结合发布者-订阅者模式的方式,通过Object.defineProperty()来劫持各个属性的getter,setter,在数据变动时发布消息给订阅者,触发相应的监听回调。我们先来看Object.defineProperty()这个方法:
<script>
var obj = {}
let middel = 100
Object.defineProperty(obj,"msg",{
get(){
return middel
},
set(val){
middel = val
}
})
obj.msg = 1111//再给 obj 设置 msg 属性的时候,会调用自身的 set 方法
console.log(obj.msg)//在打印 obj.msg 时会调用自身的 get 方法 //打印结果为1111
</script>
应用
同步显示输入框里的内容
<body>
<div id="dis"></div>
<input type="text" id="inp">
<script src="./vue.js"></script>
<script>
var obj = {};
var dis = document.querySelector('#dis')
var inp = document.querySelector('#inp')
Object.defineProperty(obj, 'name', {
get: function() {
return val;
},
set: function (newVal) {//当该属性被赋值的时候触发
inp.value = newVal;
dis.innerHTML = newVal;
}
})
inp.addEventListener('input', function(e) {
obj.name = e.target.value;// 给obj的name属性赋值,进而触发该属性的set方法
});
obj.name = 'fei';//在给obj设置name属性的时候,触发了set这个方法
</script>
</body>