JavaScript中是否可以获取对象键对应值存储位置的引用?
JavaScript实现对象深层属性引用的方案
JavaScript 原生不存在直接指向对象属性存储位置的指针/引用机制,受语法限制无法实现bptr = "Updated"直接赋值修改原对象的写法,但可以通过以下两种常用方案实现等价效果:
方案1:封装带访问器的引用对象(支持读写)
该方案最贴近你想要的引用使用习惯,通过value属性读写目标位置的值,自动同步到原对象:
// 创建单个属性的引用 function createRef(parentObj, key) { return { get value() { return parentObj[key]; }, set value(newVal) { parentObj[key] = newVal; } }; } // 支持深层路径的引用获取工具 function getDeepRef(obj, path) { let current = obj; // 遍历到目标属性的父级对象 for (let i = 0; i < path.length - 1; i++) { current = current[path[i]]; if (current === undefined || current === null) { throw new Error(`路径${path.slice(0, i+1).join('.')}不存在`); } } return createRef(current, path[path.length - 1]); }
使用示例
let anobj = { a: "aval", b: { bprime: "target", }, c: "cval" }; // 传入目标对象和属性路径数组获取引用 let bptr = getDeepRef(anobj, ['b', 'bprime']); // 读取值 console.log(bptr.value); // 输出:target // 修改值,自动同步到原对象 bptr.value = "Updated"; console.log(anobj.b.bprime); // 输出:Updated
方案2:闭包生成setter函数(轻量写操作)
如果只需要修改目标属性不需要读取,用闭包封装的setter函数性能更高、写法更简洁:
function createSetter(obj, path) { let current = obj; for (let i = 0; i < path.length - 1; i++) { current = current[path[i]]; } const targetKey = path[path.length - 1]; return (newVal) => { current[targetKey] = newVal; }; }
使用示例
// 生成bprime的修改函数 const setBprime = createSetter(anobj, ['b', 'bprime']); // 直接调用即可修改原对象属性 setBprime("Updated2"); console.log(anobj.b.bprime); // 输出:Updated2
内容的提问来源于stack exchange,提问作者ChrisNY
相关产品推荐
相关产品推荐

