这个javascript单例如何工作?

时间:2012-09-05 14:31:06

标签: javascript singleton

阅读单例函数的定义我可以看到它是单例函数。

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

2 个答案:

答案 0 :(得分:2)

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

应该是

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创建的对象的引用。