带有 module.export 和 require 的 JavaScript 中的单例?

Pav*_*kov 4 javascript singleton design-patterns

我正在尝试在 JavaScript 中实现 Singleton,我使用 Node.js module.export 和require().

我的问题是 module.export 到目前为止对我来说从一个类返回新对象。

如果我这样做,所有类都只能从单例类中使用它们而不是require()- 那么我会保证我只有一个实例吗?

因为如果所有其他类从 Singleton 导入 - 我应该如何导入 Singleton?

在 php 中,无论你有多少单例实例——每个实例共享静态属性。因此,如果您将实例设为静态,那么无论在哪个文件中调用它们,所有单例都具有相同的内存并执行相同的操作。

但是我不知道 JavaScript 是什么情况

我还有另一种方法 - 如果我let instance在文件的开头创建变量并检查它最后是否为空,如果不是,我创建另一个实例instance = new MyClass(),然后module.export = instance. 这会给我同样的结果吗?

例如我目前在做什么

class MyClass {
    //some logic here
}
module.export = new MyClass()
Run Code Online (Sandbox Code Playgroud)

我想做什么,但不知道它是好还是会起作用

if(!instance){ 
    let instance = 1;
}
class MyClass {
    //some logic here
}
if(instance === 1){
   instance = new MyClass()
}
module.export = instance
Run Code Online (Sandbox Code Playgroud)

为了让事情变得更复杂,我已经看到了几个版本的实现

这里 -> https://www.sitepoint.com/javascript-design-patterns-singleton/

有3个例子——

1.Old JS ECMA 2015 方式带函数

2.ECMA 2016 使用对象字面量代替类

3.使用类,但再次使用 Object.freeze 和 const

现在..这些版本使用了我不熟悉的 Object.freeze 和 const 变量......我也不完全确定它们是如何工作的。

回顾一下 (TL;DR) - 我想要做的是一种方法,如果我需要 10 个文件中的类,require("MyClass")我不会得到 10 个实例,而只有 1 个。

请问我的方式正常工作,并与该链接的例子Object.freeze()和使用的const良好的工作例子吗?我需要一个anctual Singleton类来完成这项工作?因为到目前为止的解决方案不包括一个。如果我需要 - 我如何传递那个单身人士所以它只有一个实例?

xer*_*ant 14

默认情况下,Node.js 模块是单例的。

引用同一文件的所有导入都将引用内存中的同一对象。你不必做任何特别的事情