【发布时间】:2016-06-30 05:28:21
【问题描述】:
我正在关注此链接https://addyosmani.com/resources/essentialjsdesignpatterns/book/ 以了解 Javascript 中的设计模式 我了解了构造函数模式、模块模式和模块显示模式,现在在单例模式中我有两个疑问:
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();不会再次成为未定义的值“实例”,因为它是一个局部变量,每次我们调用 getInstance 方法时,它都应该将实例值设置为未定义,因此
如果 ( !instance )
应该总是通过并给出一个新的实例,但我不明白它是如何在这里工作的。请解释一下。
【问题讨论】:
-
不,
var instance定义在“外部”范围内。 (不在getInstance函数范围内) -
我的建议是查看 Javascript 中的闭包。
-
感谢第 2 点现在很清楚......但是第 1 点呢?请解释...
-
@user3651606 这本书是否暗示在 javascript 中单例的使用方式与其他语言不同?该文本排序只是定义了单例是什么。
标签: javascript design-patterns