vue的基本原理--实现双向绑定mvvm
- 实现一个数据监听器Observer,能够对数据对象的所有属性进行监听,如有变动可拿到最新值并通知订阅者
- 实现一个指令解析器Compile,对每个元素节点的指令进行扫描和解析,根据指令模板替换数据,以及绑定相应的更新函数
- 实现一个Watcher,作为连接Observer和Compile的桥梁,能够订阅并收到每个属性变动的通知,执行指令绑定的相应回调函数,从而更新视图
- mvvm入口函数,整合以上三者
function observe(data) {
if (!data || typeof data !== 'object') {
return;
}
Object.keys(data).forEach(function(key) {
defineReactive(data, key, data[key])
})
}
function defineReactive(data, key, val) {
observe(val)
Object.defineProperty(data, key, {
enumerable: true,
configurable: false,
get: function() {
console.log("get")
return val;
},
set: function(newVal) {
console.log("set:"+newVal)
val = newVal;
}
})
}
var testObj = {"a":"123", "b":{"c": "456"}};
obsever(testObj);
testObj.a;
testObj.b.c;
testObj.a = "789"
testObj.b.c = "789"
function Dep() {
this.subs = []
}
Dep.prototype = {
addSub: function (sub) {
this.subs.push(sub)
},
notify: function () {
this.subs.forEach(function (sub) {
sub.update();
})
}
}