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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 20:27:03