- Proxy:JS 的“代理对象”能力,可以拦截几乎所有对对象的操作(读、写、in、delete、遍历、Reflect.ownKeys 等)。Vue3 用它做响应式。
1.拦截范围
Proxy:拦截整个对象的操作(包括新增/删除属性、数组索引、长度变化等)
2.新增/删除属性
Proxy(Vue3):obj.newKey = 1、delete obj.key 都能被拦截到,天然支持
3.数组响应式
Proxy(Vue3):对数组索引、length 等操作也能拦截,行为更统一
4.性能与实现复杂度
Proxy:按需代理,整体实现更简单,通常也更快(尤其在深层对象/频繁新增字段时)
5.兼容性
Proxy:不支持 IE(Vue3 官方不支持 IE)
小案例:新增属性这一点最直观:
// Proxy 可以拦截新增/删除
const p = new Proxy({}, {
set(target, key, value) {
console.log('set', key, value)
target[key] = value
return true
},
deleteProperty(target, key) {
console.log('delete', key)
delete target[key]
return true
}
})
p.a = 1 // 会被拦截
delete p.a // 会被拦截