0

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

但是用法让我感到困惑,您不必调用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
4

2 回答 2

2

正如 Yoshi 所说,使用线是错误的。

它应该是

var singleA = mySingleton.getInstance();
var singleB = mySingleton.getInstance();
console.log( singleA === singleB ); // true
于 2012-09-05T14:38:04.913 回答
2

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

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

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 是正确的,因为你正在比较对自身的相同精确引用:对 mySingleton 创建的对象的引用。

于 2012-09-05T14:59:42.377 回答