懂了懂了,最开始对proxy的理解有误,感谢各位指点
user === proxyUser -> false
user.wife === proxyUser.wife -> true
看到一些教程,说proxy只拦截一层,就像vue3的shallowReactive,试了下有两个疑问:
- 虽然没打印set拦截,但是目标对象user.wife.name的确变了,为什么?
- user和proxyUser指向的地址是同一个吗?? ---- 这个我懂了,user === proxyUser是false
let user = {
name: "foo",
age: 25,
job: ['a', 'b'],
wife: {
name: 'bar',
age: 24
}
};
let proxyUser = new Proxy(user, {
get(target, prop) {
console.log('劫持get()', prop)
return Reflect.get(target, prop)
},
set(target, prop, val) {
console.log('劫持set()', prop, val)
return Reflect.set(target, prop, val);
},
deleteProperty (target, prop) {
console.log('劫持delete属性', prop)
return Reflect.deleteProperty(target, prop)
}
});
proxyUser.wife.name = 'bb' // 只打印了:劫持get() wife 没有打印:劫持set()
console.log(user.wife.name) // 打印:bb ???? why???
你是把自己绕晕了吗,只拦截一层,那么wife是第二层所以不打印set不是符合预期吗?直接访问user源对象当然就不走拦截器了这有什么疑问?