首页 > 解决方案 > 解构对象在修改后丢失引用

问题描述

赋值后对象引用丢失。任何以前的参考都不再相关。

我有以下内容:

// lib.js

const obj = { prop: { data: { some: 'empty' } } };

function loadObject() {
  obj.prop.data = { some: 'load' };
}

modules.exports = { prop: obj.prop, data: obj.prop.data, loadObject() };

// main.js

const { prop, data, loadObject } = require('./lib');

loadObject();

console.log(prop.data);    // data changed (new reference)
console.log(data);         // data not changed (old reference)

如何在data不丢失其初始参考的情况下进行修改?

PS:

我有一堆文件导入这个库,它依赖于data. 我宁愿不在prop.data每个使用它的文件中替换它或重新读取它。

标签: javascriptnode.jscommonjs

解决方案


您替换data为一个新对象。没有办法将引用旧对象的所有内容更改为指向新对象,因此,如果您想保持完全相同的 API,则必须更改对象而不是替换它 - 可能就像您之前所做的那样:

// if it’s a single property that’s the same before and after
function loadObject() {
  obj.prop.data.some = 'load';
}

// if the properties before are a subset of the properties after
function loadObject() {
  Object.assign(obj.prop.data, { some: 'load' });
}

// if you need to change the set of properties entirely
function loadObject() {
  for (const key of Object.keys(obj.prop.data)) {
    delete obj.prop.data[key];
  }

  Object.assign(obj.prop.data, { some: 'load' });
}

推荐阅读