Javascript-嵌套对象上的代理触发GET而不是SET

问题描述

大家早上好

我是一名热心的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”;嵌套对象需要首先从父对象中检索......“初级,我亲爱的华生!”