问题描述
大家早上好
我是一名热心的ES6业余爱好者,最近我第一次接触了“代理对象”主题。 从到目前为止的网上资料中,我的理解是,代理在通用对象上充当包装器,该代理拦截其上的操作以更改其行为。 考虑到这一点,我尝试运行以下代码段,结果令人惊讶(至少对我而言):
"use strict";
let user = {
id: {
name: "Johnny",surname: "Potts",},age: 44,};
let userProxy = new Proxy(user,{
get(target,key,receiver) {
alert("GET triggered");
return Reflect.get(...arguments);
},set(target,value,receiver) {
alert("SET triggered");
return Reflect.set(...arguments);
},});
userProxy.id.name = "Pete"; //change an existing property in the nested object.
userProxy.id.gender = "male"; //introduce a new property in the nested object.
通过运行此代码,您会很容易注意到,每次都会触发“ GET”陷阱而不是“ SET”,并且不会在“ user”对象中写入新属性,但是现有对象会被更新。 / p>
谁能解释我为什么? 预先感谢您的时间和支持。
解决方法
答案是 PROXY 只替换了“直接”对象。 链接到代理对象的任何其他对象(例如本例中的嵌套对象)都不会被捕获。 这也解释了为什么总是调用“GET”;嵌套对象需要首先从父对象中检索......“初级,我亲爱的华生!”