Javascript中的单例设计模式

时间:2016-06-30 05:28:21

标签: javascript design-patterns

我正在关注此链接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)
应该总是通过并给出一个新的实例,但我不明白它是如何在这里工作的。请解释一下。

3 个答案:

答案 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函数中的实例变量的事实是由于闭包