You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

能否在Proxy对象的set方法中获取嵌套对象的父属性名?

在Proxy的set方法中获取嵌套对象的父属性名?

直接获取的可能性

原生Proxy的set方法无法直接拿到嵌套对象的父属性名。因为set方法的target参数是当前被修改的嵌套对象(比如例子里的inner对象),这个对象本身不存储自己在父对象中的属性名,所以默认情况下无法获取到"inner"这类父属性标识。

可行的替代解决方案

通过修改Proxy的创建逻辑,在生成嵌套Proxy时主动追踪属性路径,把路径信息绑定到handler中,就能在set方法里拿到父属性名。

示例代码如下:

function createValidator(parentPath = []) {
  return {
    get(target, key) {
      // 拼接当前属性的完整路径
      const currentPath = [...parentPath, key];
      if (typeof target[key] === 'object' && target[key] !== null) {
        // 为嵌套对象创建携带路径的Proxy
        return new Proxy(target[key], createValidator(currentPath));
      }
      return target[key];
    },
    set(target, key, value) {
      // 完整路径包含所有层级的属性名,比如修改salary时路径是 ['inner', 'salary']
      const fullPath = [...parentPath, key];
      // 取路径倒数第二个元素就是父属性名
      console.log('父属性名:', fullPath[fullPath.length - 2]); // 输出 'inner'
      console.log('当前修改属性:', key); // 输出 'salary'
      console.log('新值:', value); // 输出 'foo'
      
      target[key] = value;
      return true;
    }
  };
}

const person = {
  firstName: "alfred",
  lastName: "john",
  inner: {
    salary: 8250,
    Proffesion: ".NET Developer"
  }
};
const proxy = new Proxy(person, createValidator());
proxy.inner.salary = 'foo';

这个方案的核心是让每个嵌套Proxy的handler都携带当前属性的层级路径,每次访问子对象时,把当前属性名追加到路径中。在set方法里,通过路径数组的倒数第二个元素就能拿到父属性名,同时还能获取完整的属性层级路径,满足更多复杂场景的需求。

内容的提问来源于stack exchange,提问作者kazon

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 04:43:27