const bucket = new WeakMap()
let activeEffect = () => console.log('activeEffect');
let data = {
name:'xiaoming'
}
function track(target, key){
if(!activeEffect) return target[key]
let depsMap = bucket.get(target)
if(!depsMap) bucket.set(target, (depsMap = new Map()))
let deps = depsMap.get(key)
if(!deps){
depsMap.set(key, (deps = new Set()))
}
deps.add(activeEffect)
console.log('track => ', target, key);
}
function trigger(target, key){
let depsMap = bucket.get(target)
if(!depsMap) return
let effects = depsMap.get(key)
effects && effects.forEach(effect => effect())
console.log('trigger => ', target, key);
}
const obj = new Proxy(data, {
get(target, key){
track(target, key)
return target[key]
},
set(target, key, newVal){
target[key] = newVal
trigger(target, key)
}
})
console.log('obj.name', obj.name, obj.age);
obj.name = 'zhanghua'
obj.age = 18