Proxy能否捕获变量指向自身的赋值操作?含Object.assign场景
关于Proxy拦截两种赋值操作的可行性分析
1. 无法拦截proxy = {}这类变量重新赋值操作
proxy = {}本质是变量引用的替换——原来的Proxy实例并没有被修改,只是变量proxy不再指向它,转而指向新的空对象。Proxy的陷阱只能拦截Proxy实例自身的内部操作(比如属性读写、删除等),完全管不到变量的重新赋值行为,所以这种场景没办法被Proxy捕获。
2. 可以通过配置Proxy陷阱拦截Object.assign的操作
Object.assign({}, proxy)的执行逻辑是:先获取proxy的所有可枚举自有属性,再逐个读取属性值并赋值给目标对象。要让Proxy捕获这个过程,需要在handler中配置对应的陷阱:
ownKeys陷阱:当Object.assign获取源对象的自有键列表时会触发,你可以在这里拦截或修改返回的键集合。get陷阱:当Object.assign读取每个属性的值时会触发,能拦截属性的读取行为。
示例代码:
const handler = { ownKeys(target) { console.log('触发ownKeys陷阱,获取属性列表'); return Reflect.ownKeys(target); }, get(target, prop) { console.log(`触发get陷阱,读取属性${prop}`); return Reflect.get(target, prop); } }; let proxy = new Proxy({ name: 'test' }, handler); Object.assign({}, proxy); // 控制台输出: // 触发ownKeys陷阱,获取属性列表 // 触发get陷阱,读取属性name
如果你的handler未配置get或ownKeys,自然不会看到陷阱触发,并非Proxy无法拦截该操作。
内容的提问来源于stack exchange,提问作者Pedro Henrique
相关产品推荐
相关产品推荐

