Javascript中的单例设计模式

Javascript中的单例设计模式,javascript,design-patterns,Javascript,Design Patterns,我通过此链接了解Javascript中的设计模式我了解构造函数模式、模块模式和模块显示模式,现在在Singleton模式中我有两个疑问,如下所示: 1)我知道C++,我现在正在学习JavaScript,所以我理解单模式允许你只有一个类的实例,但是在这本书中提到“在JavaScript中,单体作为共享资源命名空间,它将实现代码与全局命名空间隔离开来,以便为函数提供单个访问点。”这是什么意思 (二) 我的疑问是当我们调用mySingleton.getInstance()时;不会再次是未定义的值“i

我通过此链接了解Javascript中的设计模式我了解构造函数模式、模块模式和模块显示模式,现在在Singleton模式中我有两个疑问,如下所示:

1)我知道C++,我现在正在学习JavaScript,所以我理解单模式允许你只有一个类的实例,但是在这本书中提到“在JavaScript中,单体作为共享资源命名空间,它将实现代码与全局命名空间隔离开来,以便为函数提供单个访问点。”这是什么意思

(二)

我的疑问是当我们调用mySingleton.getInstance()时;不会再次是未定义的值“instance”,因为它是一个局部变量,每次调用getInstance方法时,它都应该将实例值设置为未定义,因此 如果(!实例)
应该总是通过并给出一个新的实例,但我不明白它在这里是如何工作的。请解释。

1)这意味着现在只能从全局命名空间访问变量
var mySingleton
。它公开单个公共方法
getInstance
,该方法返回类的一个且仅一个实例(负责管理对该实例的私有引用的代码从范围外隐藏)


2) 否,
var实例
在“外部”范围中定义。(不在
getInstance
函数的范围内)

var mySingleton是一个iLife函数,它将返回一个对象(或在模块显示模式术语中,公开getInstance的属性)

每次代码中引用mySingleton时,代码中的内容每次都会执行。因此重置实例变量。注意,init方法还返回一个具有3个属性的对象,表明这些属性也是可公开的(可以公开,甚至私有变量也可以通过在公共函数中处理而公开。这与C++/Java概念非常相似)

最后,我们使用这个init()并将其标记为getInstance

所以当我这么做的时候 var singleA=mySingleton.getInstance(); var singleB=mySingleton.getInstance()

我可以访问(选择性地)“公开”属性singleA.publicMethod()

流程:singleA[指]getInstance()[通过]mySingleton[和]getInstance()[指]init()[公开]publicMethodpublicPropertygetRandomNumber[这间接地让您可以访问]privateRandomNumber

怀疑#1 用作共享资源命名空间并隐藏代码实现。 它在全局共享init method的私有属性和方法,而您位于init之上的命名空间1级别

私有方法是隐藏的而不是公开的

怀疑#2 每次引用mySingleton时,都会重新声明实例


希望这有助于在javascript中,对象是一个引用数据类型,这意味着这里返回的实例是相同的

var singleA = mySingleton.getInstance();
var singleB = mySingleton.getInstance();

singleA === singleB // > true

事实上,我们能够访问mySingleton的getInstance函数中的实例变量是由于闭包的

No,
var instance
定义在“外部”范围内。(不在
getInstance
函数的范围内)我的建议是查看Javascript中的闭包。感谢第2点现在已经很清楚了…但是第1点呢?请解释…@user3651606这本书是否建议Javascript中的单例与其他语言中的单例不同?sortof文本只是定义了单例是什么。
var singleA = mySingleton.getInstance();
var singleB = mySingleton.getInstance();

singleA === singleB // > true