导出类或对象实例差异

kon*_*lex 5 javascript ecmascript-6 reactjs es6-modules

我很困惑,或者我可以说,我不知道导出实际上是如何进行的。

我有一个 React 应用程序,并且有一些受保护的路由。登录时,我创建一个Client对象实例并通过 Context 将其传递给子组件,然后使用它。

最近,我看到一种方法,其中示例代码直接从文件导出对象实例,然后将其导入到他们想要使用它的文件中。

/** My approach **/
export default Example

/** The Object Instance approach **/
export default new Example()
Run Code Online (Sandbox Code Playgroud)

对象实例的生命周期是怎样的?第二种方法有什么缺点吗,因为它看起来更容易?

Cer*_*nce 5

如果您导出该类,则使用

export default Example
Run Code Online (Sandbox Code Playgroud)

那么模块的使用者将能够实例化他们自己的实例,并且每个实例将能够拥有自己的数据。例如

// 1.js
import TheClass from './TheClass';
const tc1 = new TheClass();
tc1.foo = 'foo';
Run Code Online (Sandbox Code Playgroud)
// 2.js
import TheClass from './TheClass';
const tc2 = new TheClass();
tc2.foo = 'bar';
Run Code Online (Sandbox Code Playgroud)

两个模块都可以继续使用tc1并且tc2完全独立,因为它们是单独的实例。

但是,如果原始模块导出实例而不是类,则该模块的所有使用者都被迫使用相同的实例:

// 1.js
import theInstance from '...';
theInstance.foo = 'foo';
Run Code Online (Sandbox Code Playgroud)
// 2.js
import theInstance from '...';
// might not be a good idea to do theInstance.foo = 'bar' here
// because that will affect 1.js as well
// and will affect any other modules that imported the instance
Run Code Online (Sandbox Code Playgroud)

简而言之,导出类比导出实例更具可重用性。有时编剧会认为潜在的可重用性很重要,有时则不然。(有时,即使您最初认为它没有用,以后也可能会遇到迫使您重新考虑的情况。)

有时您想确保脚本中只有一个实例,在这种情况下

export default new Example()
Run Code Online (Sandbox Code Playgroud)

是实现它的一种方法。