JavaScript中的单例设计模式



我正在遵循此链接https://addyosmani.com/resources/essentialjsdesignpatterns/book/了解JavaScript中的设计模式,我了解了我了解构造函数模式,模块模式和模块的模式,现在在Singleton模式我有两个疑问,如下:

1)我知道C ,并且现在正在学习JavaScript,因此我了解Singleton模式只允许您的一个实例,但是在本书中,它在JavaScript中提到了" Singletons在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 mysingleton 是一个iife函数,这将返回您一个对象(或在模块中揭示模式术语,暴露了getinstance的属性)

每次 mysingleton 在代码中都引用,其内部的内容每次都执行。因此重置实例变量。请注意, INIT 方法还返回具有3个属性的对象,表明这些对象也可以公开(可以公开,甚至可以通过在公共功能中处理它们。很多C /Java概念)

最后,我们使用此init()并将其标记为getinstance

因此,我做的时候var singlea = mysingleton.getInstance();var singleb = mysingleton.getInstance();

我可以访问(有选择的)"暴露"属性singlea.publicmethod()

流量: singlea [指] getInstance() [通过] mysingleton [and] getInstance()strong> [指] init() [暴露] publicMethod publicProperty getrandomnumnumnumnumber [单独给出[您可以访问] 私人和

怀疑#1 用作共享资源名称空间并隐藏代码实现。当您处于init的名称空间1级时,它在全球范围内共享私有属性和方法。

私人方法被隐藏而不暴露。

怀疑#2 每次转介mysingleton时,都会重新定义实例。

希望这有帮助

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

2)否,var instance在"外部"范围中定义。(不在getInstance函数范围中)

在JavaScript对象中是一种参考数据类型,这意味着此处返回的实例相同。

var singleA = mySingleton.getInstance();
var singleB = mySingleton.getInstance();
singleA === singleB // > true

我们能够在mysingleton的getInstance函数中访问实例变量的事实是由于关闭的

最新更新