2

メソッドgoog.addSingletonGetter()を_ _ _引数を受け取るコンストラクタを持つクラス:getInstance()

Foo = function(x, y) {...};

指定する方法はありますgoog.addSingletonGetter(Foo, arg1, arg2)か?を呼び出すとFoo.getInstance()、インスタンス化された Foo オブジェクトが遅延して返されます。

4

1 に答える 1

3

クロージャ: The Definitive Guide on page 70 ではgoog.addSingletonGetter()、次のように

ゼロ引数を取るコンストラクターを持つクラスの場合、呼び出されるたびにそのオブジェクトの同じインスタンスを返すgoog.addSingletonGetter() 静的メソッドを名前付きコンストラクター関数に追加します。getInstance()通常、コンストラクター関数が存在する場合は、コンストラクター関数の代わりに使用する必要があります。

1 つのアプローチは、静的関数を追加して、143 ページのJavaScript パターンに示されている静的プロパティデザイン パターンのインスタンスに続くシングルトンを作成することです。getInstance()

/**
 * @param {string=} opt_x
 * @param {string=} opt_y
 * @constructor
 */
Foo = function(opt_x, opt_y) {

  if(Foo.instance_) {
    return Foo.instance_;
  }

  /**
   * @type {string}
   * @private
   */
  this.x_ = goog.isDefAndNotNull(opt_x) ? opt_x : 'default_X';

  /**
   * @type {string}
   * @private
   */
  this.y_ = goog.isDefAndNotNull(opt_y) ? opt_y : 'default_Y';

  Foo.instance_ = this;
};


/**
 * Get the singleton instance of Foo.
 * @param {string=} opt_x
 * @param {string=} opt_y
 */
Foo.getInstance = function(opt_x, opt_y) {
  if (Foo.instance_) {
    return Foo.instance_;
  }
  return new Foo(opt_x, opt_y);
};

このパターンを使用する利点は、誰かが次のように記述した場合に、誤って複数のインスタンスを構築することを防ぐことです。

var foo = new Foo();

... 
// thousands of lines later
var snafoo = new Foo(); // Returns the singleton instance.   
于 2012-07-30T23:01:05.793 に答える