3

clientそこで、JavaScript で作成しているビデオ ゲームのベースとなるクラスを呼び出したいと思います。

clientインスタンスは 1 つしか存在できないクラスである必要がありますが、その最初の作成は、ユーザーが「開始」ボタンをクリックしたときなど、特定のイベントで自分で設定する必要があります。

私は自分自身をシングルトンクラスにして、テストのためだけにアンロードを開始しています:

// Singleton class for the client
var client = (function() {

  // Public methods
  var _this = {
    construct: function() {
      delete _this.construct;
      _this.director = new lime.Director(document.body, window.innerWidth, window.innerHeight); // Setup the rendering engine
    }
  }
  return _this;
})();

// Fire when dependencies are loaded
window.onload = client.construct;

問題:

しかし、私はこれをオープン ソース プロジェクトにするつもりであり、最後の行client.constructは非常に珍しい規則のようです。new Clientで構築され、二度と構築されないように、シングルトン クラスを作成するにはどうすればよいですか?

4

6 に答える 6

3

通常のオブジェクト指向言語で使用するのと同じパターンを使用できます。インスタンスを「プライベート」または「静的」プロパティに格納します (これらの用語は JavaScript には正確に適用されないため、引用しています)。コードでは、「プライベート」プロパティを使用してインスタンスを格納すると、次のようになります (「静的」プロパティはコンストラクタのプロパティになります)。

var Client = (function() {
    // Our "private" instance
    var instance;

    // The constructor
    function Client() {

        // If it's being called again, return the singleton instance
        if(typeof instance != "undefined") return instance;

        // initialize here

        // Keep a closured reference to the instance
        instance = this;
    }

    // Add public methods to Client.prototype
    Client.prototype.myPublic = function() {

    }

    // Return the constructor
    return Client;
})();


var c1 = new Client();
var c2 = new Client();

console.log(c1 == c2); // true

http://jsfiddle.net/hBvSZ/

于 2013-06-29T22:38:42.690 に答える
1

このようなもの:

var Client = (function ClientClass(){

  var instance;

  // Constructor
  function Client() {
    if (instance) throw 'Already instantiated';
    this.director = new lime.Director(...);
    instance = true;
  }

  Client.prototype = {
    // Public methods
  };

  return Client;

}());
于 2013-06-29T22:33:43.180 に答える
0

これはあなたが望むものかもしれません:

var initialized = false;

function initialize() {
    if (!initialized) {
        window.client = new Client();
        initialized = true;
    }
}

window.onload = initialize;
于 2013-06-29T22:17:19.577 に答える
0

あなたはそうしない。厳密に型指定された言語では、シングルトンは、プライベート コンストラクターを持ち、クラスの唯一のインスタンスを含む静的プロパティを公開することによって作成されます。2 回目のインスタンス化を防ぐためにできる唯一のことは、例外をスローすることですが、それはさらに悪い設計です。ただし、オブジェクトのインスタンス化を遅らせることができます:

// A wrapper function
var client = (function () {
    var client = function() {
       // Actual class
    }
    var instance = null;
    // Property to return the instance
    Object.defineProperty("instance", {
        get: function () {
            if (!instance) { instance = new client(); }
            return instance;
        }
    }
   return client;
})();
于 2013-06-29T22:18:17.657 に答える