const arrayProto = Array.prototype;
const arrayMethods = Object.create(arrayProto);
['push','pop','shift','unshift','splice','sort','reverse'].forEach(function(method){
const original = arrayProto[method];
def(arrayMethods,method,function mutator(...args){
const result = original.apply(this,args)
console.log("--2--")
console.log(this)
const ob = this.__ob__;
let inserted
switch (method){
case 'push':
case 'unshift':
inserted = args
break
case 'splice':
inserted = args.slice(2)
break
}
if(inserted) ob.observerArray(inserted)
ob.dep.notify()
return result;
})
})
class Observer {
constructor (value) {
this.value = value;
this.dep = new Dep();
def(value,'__ob__',this)
if(Array.isArray(value)){
value.__proto__ = arrayMethods;
this.observerArray(value)
}
}
observerArray(items){
for (var i = 0; i < items.length; i++) {
console.log(items[i])
observer(items[i])
}
}
}
class Dep {
constructor(){
this.subs = []
}
addSub(sub){
this.subs.push(sub)
}
removeSub(sub){
remove(this.subs,sub)
}
depend(){
this.addSub(window.target)
}
notify(){
console.log("--依赖派发--")
};
}
function remove(arr,item){
const index = arr.indexOf(item)
return arr.splice(index,1)
}
function defineReactive (data,key,val){
let childOb = observer(val)
Object.defineProperty(data,key,{
enumerable:true,
configurable:true,
get:function(){
if(childOb){
console.log("--收集依赖--")
}
return val
},
set:function(){
console.log("--set--")
}
})
}
function observer(value){
console.log("---3---")
if(!(value instanceof Object)){
return
}
console.log(value)
ob = new Observer(value)
return ob;
}
function def(obj,key,val,enumerable){
Object.defineProperty(obj,key,{
value:val,
enumerable:!!enumerable,
writable:true,
configurable:true
})
}
let arrayList = {
list:[1,3,5,7]
}
defineReactive(arrayList,"list",arrayList.list)
arrayList.list.push(9)
console