gpt4 book ai didi

javascript - 这个 javascript 单例是如何工作的?

转载 作者:行者123 更新时间:2023-11-28 16:13:08 29 4
gpt4 key购买 nike

阅读单例函数的定义,我可以明白它是如何成为单例的。

但是用法让我很困惑,你不是必须调用getInstance吗?

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";

return {

// Public methods and variables
publicMethod: function () {
console.log( "The public can see me!" );
},

publicProperty: "I am also public"
};

};

return {

// Get the Singleton instance if one exists
// or create one if it doesn't
getInstance: function () {

if ( !instance ) {
instance = init();
}

return instance;
}

};

})();

// Usage:

var singleA = mySingleton;
var singleB = mySingleton;
console.log( singleA === singleB ); // true

最佳答案

Jerry 的最后三行可能应该是您示例中的内容,但我认为您需要更多地了解此代码中发生的情况,才能理解为什么 Jarry 提供的示例和您的原始代码都会评估为真。

以原始示例中的这行代码为例:

var singleA = mySingleton;

你在这里所说的是,singleA等于对mySingleton的引用,那么当你将mySingleton分配给singleB时,你只是给了singleB对mySingleton相同的引用(在mySingleton中没有调用任何代码,你只是设置一个引用)。因此,您正在将相同的精确引用与其自身进行比较:对 mySingleton 的引用。

这是 Jarry 的代码的工作原理,请注意:

var singleA = mySingleton.getInstance();

这会导致 mySingleton 对象实际调用其中的函数来创建单例对象。第一次调用此函数时,它会在代码中创建一个新对象,并且在每次后续调用时,它将返回创建的同一对象(这基于 init() 中的代码)。

这意味着当您使用 mySingleton.getInstance 时,您正在创建一个新对象并将 singleA 设置为对该对象的引用。然后,当您为“var singleB = mySingleton.getInstance()”调用“mySingleton.getInstance()”时,它将返回上一行创建的同一对象的引用并将其分配给 singleB。因此,当您完成所有操作后,比较 singleA === singleB 为 true,因为您正在比较与其自身相同的精确引用:对 mySingleton 创建的对象的引用。

关于javascript - 这个 javascript 单例是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12283811/

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