如何通过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
相关产品推荐
相关产品推荐

