function proxyObject(obj, key, val, enume){Object.defineProperty(obj, key, {value: val,enumerable: !!enume,writable: true,configurable: true});};接下来,就是实现$set方法了,整体结构如下:
proxyObject(extendObj, "$set", function(key, val){//this指向extendObjif(this.hasOwnProperty(key)){return;}else{/* TODO:在extendObj中监听key属性, 且,若key属性值为对象,再次监听key属性值*/ }});看到上面的TODO注释,是否似曾相识,不就是是在“模拟Vue之数据驱动2”遇见过的嘛,通过Observer.prototype.convert监听key属性,通过new Observer再次监听key属性值不就完啦。
//observer.jsp.walk = function(data){let keys = Object.keys(data);keys.forEach( key => {let val = data[key];if(typeof val === "object"){new Observer(val);}this.convert(key, val);});//$Observer属性指向Observer自身实例data.$Observer = this;}//新增一个observe方法p.observe = function(data){if(typeof data === "object"){new Observer(data);}}好了,这样之后,得$set整体实现如下:
proxyObject(extendObj, "$set", function(key, val){if(this.hasOwnProperty(key)){return;}else{proxyObject(this, key, val, true);let ob = this.$Observer;ob.observe(val);ob.convert(key, val);}});到此,一个简单的$set方法构建完毕。
//observer.jsfunction Observer(data){if(!(this instanceof Observer)){return new Observer(data);}//将监听对象的隐指针指向我们的extendObj对象data.__proto__ = extendObj;this.data = data;this.walk(data);}好了,一切完毕,接下来就测试下吧:
<script src="./extendObj.js"></script><script src="./observer.js"></script><script>let data = {user: {name: "Monkey",age: 24},lover: {name: "Dorie",age: 23}};Observer(data);</script>效果如下:
Perfect,完整代码见github。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。