首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何导入为object的新副本?

如何导入为object的新副本?
EN

Stack Overflow用户
提问于 2018-06-27 16:20:10
回答 5查看 1.4K关注 0票数 3

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

这个库:

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

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

我检查了javascript是否使用了引用,所以这两个组件实际上引用的是同一个东西。

Does import create a new copy of imported library?

ES6 variable import by reference or copy

有没有可能在不更改源代码的情况下(理想情况下),我可以执行如下操作

代码语言: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。

EN

回答 5

Stack Overflow用户

发布于 2018-06-27 16:25:12

不,没有通用的通用方法来克隆模块或加载模块的单独副本。您也许能够做到这一点,但这将取决于模块的具体编码方式。

不幸的是,您正在使用的库没有实例的概念,而不是使库中的所有内容都是全局的。您可以考虑将该概念添加到库中,并向原始repo发送一个pull请求(如果他们拒绝,您可以随时创建一个fork)。

票数 3
EN

Stack Overflow用户

发布于 2018-06-27 16:28:17

您可以在每个文件中克隆rates对象:-

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

票数 0
EN

Stack Overflow用户

发布于 2018-06-27 21:15:33

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

在本例中,库是hard-coded to use fx.rates object。即使它被复制,它也会继续使用它。

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

另一种方法是创建一个包装器,使库按照预期的方式运行。考虑到它是使用fx.ratesconvert方法,并且它是同步的,可以在调用期间对其进行修补以交换rates属性:

代码语言:javascript
运行
复制
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);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51057918

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档