好了,理清了大体思路,下面我们就一起来创建一个Observer吧。
二、Observer构造
Observer整体结构如下:
function Observer(data){ //如若this不是Observer对象,即创建一个 if(!(this instanceof Observer)){ return new Observer(data); } this.data = data; this.walk(data); }let p = Observer.prototype = Object.create(null);p.walk = function(data){ /* TODO:监听data数据中的所有属性, 并查看data中属性值是否为对象, 若为对象,就创建一个Observer实例 */ }p.convert = function(key, val){ //TODO:通过Object.defineProperty监听数据 }好了,下面,我们一起来完成walk以及convert方法吧。
p.walk = function(data){ let keys = Object.keys(data); keys.forEach( key => { let val = data[key]; this.convert(key, val); });}且,由于属性中可能又会是一个对象,那么,我们就有必要监听它们。
p.walk = function(data){ let keys = Object.keys(data); keys.forEach( key => { let val = data[key]; //如果val为对象,则交给Observer处理 if(typeof val === "object"){Observer(val); } this.convert(key, val); });}你可能会有这样的疑问,如果直接利用Observer处理对象,那么不就与父对象失去关联了么?
p.convert = function(key, val){ Object.defineProperty(this.data, key, { get: ()=>{console.log("访问了"+key+" 值为"+val);return val; }, set: (newVal)=>{console.log("设置了"+key+" 值为"+newVal);if(newVal !== val){val = newVal;} } });}好了,到此,一个简单的Observer就构造完成,下面我们就来测试下,是否成功监听了每个属性。
<script src="./observer.js"></script><script> let data = { user: {name: "Monkey",age: 24 }, lover: {name: "Dorie",age: 23 } }; Observer(data);</script>效果如下:
Perfect,完整代码见github。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。