我正在关注此链接https://addyosmani.com/resources/essentialjsdesignpatterns/book/以了解Javascript中的设计模式我理解构造函数模式,模块模式和模块显示模式,现在采用Singleton模式我有以下两个疑问:
1)我知道c ++,我现在正在学习JavaScript,所以我理解单例模式只允许你使用该类的一个实例,但在本书中提到“在JavaScript中,单例作为共享资源命名空间,它隔离了实现代码全局命名空间,以便为函数提供单点访问。“这是什么意思???
2)
var mySingleton = (function () {
// Instance stores a reference to the Singleton
var instance;
function init() {
// Singleton
// Private methods and variables
function privateMethod(){
console.log( "I am private" );
}
var privateVariable = "Im also private";
var privateRandomNumber = Math.random();
return {
// Public methods and variables
publicMethod: function () {
console.log( "The public can see me!" );
},
publicProperty: "I am also public",
getRandomNumber: function() {
return privateRandomNumber;
}
};
};
return {
// Get the Singleton instance if one exists
// or create one if it doesn't
getInstance: function () {
if ( !instance ) {
instance = init();
}
return instance;
}
};
})();
var singleA = mySingleton.getInstance();
var singleB = mySingleton.getInstance();
我怀疑是什么时候调用mySingleton.getInstance();将不再是值“instance”undefined,因为它是一个局部变量,每当我们调用getInstance方法时,它应该将实例值设置为undefined,因此
if(!instance)
应该总是通过并给出一个新的实例,但我不明白它是如何在这里工作的。请解释一下。
答案 0 :(得分:1)
var mySingleton 是一个IIFE函数,它会返回一个对象(或者在模块中显示模式术语,暴露getInstance的属性)
每次在代码中引用 mySingleton 时,其中的内容每次都会执行。因此重置实例变量。注意, init 方法还返回一个具有3个属性的对象,表明它们也是可公开的(可以公开,甚至私有变量也可以通过在公共函数中处理它们来公开。)很多C ++ / Java概念)。
最后,我们使用这个init()并将其标记为getInstance
因此,当我这样做 var singleA = mySingleton.getInstance(); var singleB = mySingleton.getInstance();
我可以访问(有选择地)"暴露"属性singleA.publicMethod()
流量: singleA [指] getInstance() [透露] mySingleton [和] getInstance() [指] init() [暴露] publicMethod , publicProperty 和 getRandomNumber [间接给出您可以访问] privateRandomNumber
怀疑#1 充当共享资源命名空间并隐藏代码实现。 当您处于init上的命名空间1级时,它将全局共享init方法的私有属性和方法。
隐藏私有方法而不暴露。
怀疑#2 每次引用mySingleton时,都会重新声明实例。
希望这有帮助
答案 1 :(得分:0)
1)这意味着现在只能从全局命名空间访问变量var mySingleton
。它公开了单个公共方法getInstance
,它返回一个且只返回一个类的实例(负责管理对此实例的私有引用的代码在外部作用域中是隐藏的)。
2)不,var instance
在"外部"中定义范围。 (不在getInstance
函数范围内)
答案 2 :(得分:0)
在javascript中Object是一种引用数据类型,这意味着此处返回的实例是相同的。
var singleA = mySingleton.getInstance();
var singleB = mySingleton.getInstance();
singleA === singleB // > true
以及我们能够访问mySingleton的getInstance函数中的实例变量的事实是由于闭包