2012-07-30 2 views
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() к классу с конструктором, который принимает аргументы:Есть ли вариант goog.addSingletonGetter() для конструкторов с аргументами?

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

Есть ли способ для меня, чтобы указать goog.addSingletonGetter(Foo, arg1, arg2)? Звонки на Foo.getInstance() тогда лениво вернули бы экземпляр объекта Foo.

ответ

3

Closure: The Definitive Guide на странице 70 Определяет goog.addSingletonGetter() следующим образом:

Для класса с конструктор, который принимает нулевые аргументы, goog.addSingletonGetter() добавляет статический метод его функции конструктора по имени getInstance(), который возвращает тот же экземпляр этого объекта, когда он вызывается. Как правило, он должен использоваться вместо функции-конструктора, если он существует.

Один подход должен был бы создать синглтон после Instance в статическом свойстве шаблон проектирования, представленные в JavaScript Patterns на странице 143 с добавлением статической 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.