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

Jerry はおそらくあなたの例の最後の 3 行にあると思われるものを持っていますが、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 の比較は true になります。これは、それ自体に対するまったく同じ参照 (mySingleton によって作成されたオブジェクトへの参照) を比較しているためです。

于 2012-09-05T14:59:42.377 に答える
2

ヨッシーが言ったように、使用法は間違っています。

そのはず

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