Javascript 如何作为对象的新副本导入?

Javascript 如何作为对象的新副本导入?,javascript,reactjs,webpack,ecmascript-6,Javascript,Reactjs,Webpack,Ecmascript 6,在我的react应用程序中,我想在两个具有不同设置的组件中使用库(money.js) 此库: 我检查了javascript是否使用了引用,因此这两个组件实际上引用了相同的东西 在不改变源代码的情况下(理想情况下),这是可能的吗 // a.js import fx from 'money' fx.rates={USD:1, EUR: 2.001} // b.js import fx from 'money' fx.rates={USD:1, EUR: 2.002} 在我的情况下,我注意

在我的react应用程序中,我想在两个具有不同设置的组件中使用库(money.js)

此库:

我检查了javascript是否使用了引用,因此这两个组件实际上引用了相同的东西

在不改变源代码的情况下(理想情况下),这是可能的吗

// a.js
import fx from 'money'
fx.rates={USD:1, EUR: 2.001}

// b.js
import fx from 'money'
fx.rates={USD:1, EUR: 2.002}

在我的情况下,我注意到更改b.js中的速率也会影响a.js

不,没有通用的一刀切的方法来克隆模块或加载模块的单独副本。您可以这样做,但这取决于模块的具体编码方式


不幸的是,您正在使用的库没有实例的概念,而没有将所有内容都放在库的全局范围内。您可以考虑将该概念添加到库并发送原始回购请求(如果拒绝,则总是可以创建叉).< /p> 您可以在每个文件中克隆率对象:-< /p>
var localRatesVariable=Object.assign({},fx.rates)

模块只评估一次,这是其主要属性之一。可以在支持某个模块的环境(Node.js)中重新评估该模块,但在客户端应用程序中不支持该模块

在这种情况下,该库是可用的。即使它被复制,它也会继续使用它

正确的方法是修改库源代码以支持多个实例

另一种方法是创建一个包装器,使库的行为符合预期。考虑到它是使用
fx.rates
convert
方法,并且是同步的,因此可以在调用期间将其修补为swap
rates
属性:

import fx from 'money'

export default function fxFactory(rates) {
  return Object.assign({}, fx, {
    convert(...args) {
      let convertResult;
      const ratesOriginal = fx.rates;
      try {
        fx.rates = rates;
        convertResult = fx.convert(...args);
      } finally {
        fx.rates = ratesOriginal;
      }
      return convertResult;
    }
  });
}

// a.js
import fxFactory from './fx'
const rates={USD:1, EUR: 2.001};
const fx1 = fxFactory(rates);

您可以深度复制对象:

let localRatesVariable = JSON.parse(JSON.stringify(fx.rates));

关于JS模块生态系统的一个很好的解释可以在这里找到-。由于ES6模块是活动的只读副本,因此您必须在另一个jS对象中维护您的“速率”或任何特定于模块的配置(如果可以,请提供服务)。只需在创建的服务中使用特定库中提供的实用程序。希望这有帮助!@AmanshuKataria的可能副本-不,模块比简单对象复杂得多。@ShobWitchittora-ES2015模块不是只读的。它们是共享的。谢谢。我想只要我想使用FX,我就会使用一个额外的变量来存储和恢复速率。这不是一个深度克隆。每个“按引用”特性将指向原始对象中的相同特性。