let arrayProto = Array.prototype//改写let proto = Object.create(arrayProto)//相当于沿着这个对象__proto__可以找到Array上的方法。;['push','split','unshift'].forEach(method=>{//等等数组操作方法
proto[method]=function(...args){
console.log('更新');let tmp;switch(method){//为了拿到参数,把参数也代理。case'push':case'unshift':tmp = args ;breakcase'splice':tmp=args.slice(2);default:break;}observer(tmp)
arrayProto[method].call(this,...args)}})functiondefineReactive(obj,key,value){if(typeof value ==='object'){observer(value)}
Object.defineProperty(obj,key,{get(){return value
},set(newVal){if(value!==newVal){if(typeof newVal==='object'){observer(newVal)}
console.log('更新');
value =newVal
}}})}functionobserver(obj){if(typeof obj !=='object'&& obj ==='null'){return obj
}if(Array.isArray(obj)){for(let i =0;i<obj.length;i++){
Object.setPrototypeOf(obj,proto)//相当于把Obj的__proto__改掉了observer(obj[i])}}else{for(let key in obj ){defineReactive(obj,key,obj[key])}}}//测试代码// let data = {name : 'yehuo',age:11}// observer(data)// data.name={123:21,232:213}// console.log(data.name[123]);// let data = {123:{213:32}}// observer(data)// data[123][213]=5// console.log(data[123][213]);let data =[1,2,{3:22}]observer(data)// data[2][3]=500// console.log(data[2][3]);
data.push({23:123})
data[3][23]=111
console.log(data[3][23]);