gpt4 book ai didi

javascript - Javascript 中的单例设计模式

转载 作者:行者123 更新时间:2023-11-30 00:07:05 26 4
gpt4 key购买 nike

我正在关注此链接 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();不会再是未定义的值“instance”,因为它是一个局部变量,每次我们调用 getInstance 方法时,它都应该将实例值设置为未定义,因此 如果(!实例)
应该总是通过并提供一个新实例,但我不明白它在这里是如何工作的。请解释。

最佳答案

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

每次在代码中引用mySingleton,里面的内容每次都会执行。因此重置实例变量。请注意,init 方法还返回一个具有 3 个属性的对象, 表明这些属性也是可公开的(可以公开,甚至私有(private)变量也可以通过在公共(public)函数中处理它们来公开。漂亮很多 C++/Java 概念)

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

因此当我这样做时var singleA = mySingleton.getInstance();var singleB = mySingleton.getInstance();

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

流程:singleA [指代] getInstance() [通过] mySingleton [和] getInstance() [指的是] init() [公开] publicMethodpublicPropertygetRandomNumber [间接给出你访问] privateRandomNumber

第一个疑问作为共享资源命名空间并隐藏代码实现。当您位于 init 之上的命名空间 1 级别时,它正在全局共享 init 方法的私有(private)属性和方法。

私有(private)方法是隐藏的,不暴露。

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

希望对你有帮助

关于javascript - Javascript 中的单例设计模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38114614/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com