2

我想使用goog.addSingletonGetter()http://closure-library.googlecode.com/svn/!svn/bc/4/trunk/closure/goog/docs/closure_goog_testing_singleton.js.source.html#line56)将getInstance()方法添加到具有接受参数的构造函数的类:

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

有没有办法让我指定goog.addSingletonGetter(Foo, arg1, arg2)?然后调用Foo.getInstance()将懒惰地返回实例化的 Foo 对象。

4

1 回答 1

3

结束语:第 70 页的权威指南goog.addSingletonGetter()定义如下:

对于具有零参数的构造函数的类,goog.addSingletonGetter() 将静态方法添加到其名为的构造函数中,该方法在getInstance()调用时返回该对象的相同实例。一般来说,如果存在的话,应该使用它来代替构造函数。

一种方法是在第 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 回答