var data = { name: "fangtangxiansheng", job: "fe", power: 0};console.log(data);let target = null;class willObserver { watchList = []; // 减少观察者 addWatch() { target && (this.watchList =[... new Set([...this.watchList, target])]); } watchUpdate() { this.watchList.forEach((watch) => { watch.update(); }); } // 告诉 notiy() { this.watchUpdate(); }}class Watch { constructor(cb) { this.cb = cb; target = this; } update() { this.cb(); }}const creatWatch = (expCondition, cb) => { new Watch(cb); expCondition();};// 结构 ”数据依赖埋点“const trasnfromDataToAutoListion = (data) => { Object.keys(data).forEach((key) => { let cache = data[key]; let _ob = new willObserver(); Object.defineProperty(data, key, { // 做一下埋点 set(v) { cache = v; _ob.notiy(); }, // 触发watch 实例更新 get() { _ob.addWatch(); return cache; } }); });};trasnfromDataToAutoListion(data);creatWatch( () => { console.log("condition", data.name, data.job); }, () => { document.querySelector("#html").innerHTML = JSON.stringify(data); });document.querySelector("#html").innerHTML = JSON.stringify(data);setInterval(() => { data.power = `${Math.random() * 100}%`;}, 500);
demo