创建新 class 与使用 export const 之间的区别

Differences between creating a new class to using export const

设置:

CommonJS 和 ES6 的新手。我知道对象实例和方法的静态容器之间的区别,但我不确定它们在分离到模块时的行为方式。所以我想知道返回实例之间有什么区别(这种模式是否有效?):

// StateParser.js

class StateParser {
    constructor() {
     }

     method1() {
        ...
     }

}

export default new StateParser()

并导出 const 方法:

// StateParser.js

let state = {
}

export const method1 = () => { ... }
  1. 方法A:每次导入都会有新实例吗?
  2. 方法 B:使用对象解构的好处之一:

    import { method1 } from '../utils/StateParser.js';
    

    然后像本地存在的方法1一样使用?

  3. 方法A:好处之一是能够在构造函数中初始化状态吗?

所以基本上我不确定什么时候为我的实用程序使用哪个 类,非常感谢您的意见。

Would there be a new instance every time I import A?

不,模块只评估一次。

Is one of the benefits of B the ability to use object destructuring and then use method1 as if it existed locally?

是的,虽然它不叫 "destructuring"。它们是 named imports(或模块的 named exports),它们不嵌套并使用不同的别名语法。

Is one of the benefits of A the ability to initialize state in the constructor?

没有。您也可以直接在模块范围内初始化模块状态,不需要构造函数。

但是,是的,如果您在实例中有状态,最好使用可以 实例化多次 的 class。为此,您需要导出 class 本身,当然不是实例。

Is the export default new … pattern valid at all?

不,由于上述原因,它是一种反模式。鉴于 class 没有在其他任何地方使用,它与 antipattern. And exporting multiple named exports 非常相似,而不是默认导出对象。

We don't recommend 出于多种原因导出评估(例如 new StateParser())。

在这种情况下,模块导出只评估一次的结果(@Bergi 也提到)。这很少是期望的结果,但如果是,则应改用单例模式。失去了一些 ES6 模块的好处(tree-shaking and faster access to imports),它使导入速度变慢并可能导致副作用,而这些副作用应该在调用时发生。我也认为这是一种反模式,可以通过导出函数或 class.

来避免缺点

export default StateParser 与导出 const 方法进行比较更有意义。

另请参阅: