能否在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
相关产品推荐
相关产品推荐

