阅读单例函数的定义我可以看到它是单例函数。
但是用法让我感到困惑,你不必调用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
答案 0 :(得分:2)
应该是
var singleA = mySingleton.getInstance();
var singleB = mySingleton.getInstance();
console.log( singleA === singleB ); // true
答案 1 :(得分:2)
Jerry有可能在你的例子中作为最后三行,但我认为你需要更多地了解这段代码中发生的事情,以理解Jarry提供的示例和原始代码评估的原因为真。
以原始示例中的这行代码为例:
var singleA = mySingleton;
你在这里说的是singleA等于对mySingleton的引用,然后当你将mySingleton分配给singleB时,你只是给了singleB与mySingleton完全相同的引用(mySingleton中没有代码被调用,你只是设置参考)。因此,您正在比较与其自身相同的完全引用:对mySingleton的引用。
以下是Jarry的代码如何运作,请注意以下几行:
var singleA = mySingleton.getInstance();
这会导致mySingleton对象实际调用其中创建单个对象的函数。在第一次调用此函数时,它会在代码中创建一个新对象,并且在每次后续调用时,它将返回创建的相同对象(这基于init()中的代码)。
这意味着当您使用mySingleton.getInstance时,您将创建一个新对象并将singleA设置为对该对象的引用。然后当你打电话给#34; mySingleton.getInstance()" for" var singleB = mySingleton.getInstance()"它返回在前一行创建的同一对象的引用,并将其分配给singleB。因此,当你说完所有时,比较singleA === singleB是真的,因为你正在比较与它自己相同的精确引用:对mySingleton创建的对象的引用。