单例在JavaScript中使用module.export并需要?

时间:2018-02-13 08:59:49

标签: javascript design-patterns singleton

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

我的问题是到目前为止,module.export从类中返回新对象。

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

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

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

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

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

例如我目前所做的事情

module.export = instance

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

class MyClass {
    //some logic here
}
module.export = new MyClass()

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

此处 - > https://www.sitepoint.com/javascript-design-patterns-singleton/

有3个例子 -

1.旧JS ECMA 2015方式功能

2.ECMA 2016与对象文字而不是类

3.与类同时使用Object.freeze和const

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

回顾(TL; DR) - 我想要做的是这样一种方式,如果我需要10个带if(!instance){ let instance = 1; } class MyClass { //some logic here } if(instance === 1){ instance = new MyClass() } module.export = instance 的文件中的一个类,我将不会得到10个实例但只有1个。

我的方式是否正常运行并且是require("MyClass")链接中的示例以及Object.freeze()良好工作示例的使用?我是否需要一个正常的Singleton类来完成这项工作?因为到目前为止解决方案不包括一个。如果我需要 - 我如何传递Singleton,因此它只有一个实例?

1 个答案:

答案 0 :(得分:2)

Node.js modules are singletons by default.

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