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

时间:2018-06-27 08:20:10

标签: javascript reactjs webpack ecmascript-6

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

此库:
http://openexchangerates.github.io/money.js/
http://openexchangerates.github.io/money.js/money.js

我检查了javascript是否正在使用引用,所以这2个组件实际上是在引用相同的内容。

Does import create a new copy of imported library?

ES6 variable import by reference or copy

有可能不更改源代码(理想情况下),我可以做类似以下的事情

// 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。

4 个答案:

答案 0 :(得分:1)

否,没有通用的“一刀切”方式来克隆模块或加载模块的单独副本。您也许可以做到,但这将取决于模块的编码方式。

很不幸,您使用的库没有 instance 的概念,而不是使所有内容对库都是全局的。您可能会考虑将这个概念添加到库中,并向原始存储库发送一个拉取请求(如果他们拒绝了,您可以随时创建一个派生)。

答案 1 :(得分:0)

您可以在每个文件中克隆该评级对象:-

var localRatesVariable = Object.assign({}, fx.rates);

答案 2 :(得分:0)

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

在这种情况下,库为hard-coded to use fx.rates object。即使被复制,它也会继续使用。

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

一种替代方法是创建一个包装程序,以对该库进行黑客攻击,使其表现出预期的效果。考虑到使用convert的{​​{1}}方法是同步的,因此可以在调用过程中修补它以交换fx.rates属性:

rates

答案 3 :(得分:0)

您可以深度复制对象:

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