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

如何通过Proxy捕获不存在的对象属性访问并输出完整路径

实现访问不存在属性时返回完整路径的Proxy方案

你当前的代码存在两个核心问题:一是target.toString()会返回[object Object]而非根对象名称,二是直接给原对象添加属性会污染原始数据。以下是修正后的方案,既能实现需求,又能避免上述问题:

const myLocalize = {
    home: "content of abc"
};

function createPathTrackingProxy(rootObj, rootPath) {
    return new Proxy(rootObj, {
        get(target, prop) {
            // 处理已存在的属性
            if (prop in target) {
                const value = target[prop];
                // 若属性值是对象/函数,继续返回带路径的Proxy
                if (typeof value === 'object' && value !== null || typeof value === 'function') {
                    return createPathTrackingProxy(value, `${rootPath}.${prop}`);
                } else {
                    // 基本类型包装成对象,支持链式访问并保留原值的toString
                    return createPathTrackingProxy({
                        toString: () => value
                    }, `${rootPath}.${prop}`);
                }
            }
            // 处理不存在的属性,返回带当前完整路径的Proxy
            return createPathTrackingProxy({}, `${rootPath}.${prop}`);
        },
        // 重写toString的属性描述符,让每个Proxy的toString返回当前路径
        getOwnPropertyDescriptor(target, prop) {
            if (prop === 'toString') {
                return {
                    enumerable: false,
                    configurable: true,
                    writable: false,
                    value: () => rootPath
                };
            }
            return Reflect.getOwnPropertyDescriptor(target, prop);
        }
    });
}

// 创建根Proxy,指定根对象名称作为初始路径
const useMyLoc = createPathTrackingProxy(myLocalize, 'myLocalize');

// 测试访问不存在的链式属性
console.log(String(useMyLoc.home.title.desc.plain));
// 输出: myLocalize.home.title.desc.plain

// 测试访问已存在的属性值
console.log(String(useMyLoc.home));
// 输出: content of abc

核心逻辑说明

  • 路径跟踪:每个Proxy实例都携带当前的访问路径,根路径设为对象名称myLocalize,每访问一个属性就自动拼接路径片段。
  • 无污染原对象:所有动态生成的属性逻辑都在Proxy层处理,不会修改原始的myLocalize对象。
  • 兼容基本类型:对于字符串这类基本类型属性,包装成带有自定义toString的对象,既保留原属性值,又支持后续链式访问生成完整路径。
  • 自定义toString:每个Proxy的toString方法直接返回当前的完整访问路径,通过String()转换即可得到目标输出。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 15:02:54