Vue的双向数据绑定的原理(v-model的原理:value+oninput)
* View -> Model : 事件
* Model -> View :getter&setter
* vue在实例化时会遍历data中所有属性,通过Object.defineProperty()方法把它们设置为存储器属性(getter & setter),并写入Vue实例
以下使用原生JS实现vue实例化时将data的属性设置为存储器属性,并写入Vue实例
function Vue(option) {
this.$el = document.querySelector(option.el);
let data = this.$data = option.data;
this.proxyData(data);
}
Vue.prototype.proxyData = function(data) {
var arr = [];
for (var key in data) {
var obj = [];
obj[0] = key
obj[1] = data[key];
arr.push(obj)
}
arr.forEach((item, idx) => {
Object.defineProperty(this, item[0], {
configurable: true,
enumerable: true,
get: function() {
return data[item[0]]
},
set: function(val) {
data[item[0]] = val
}
})
})
}
let vm = new Vue({
el: "#app",
data: {
name: "lemon",
age: 18
}
});
console.log(vm)