1

我有这个功能:

WSConnection: function() {
   var instance = new Connection();
   return instance;
},

如何调整此代码(避免创建多个实例),以便Connection在调用时始终获得类的相同实例WSConnection();

4

5 回答 5

4

或许:

WSConnection: function() {
   this.instance = this.instance || new Connection();
   return this.instance;
},

在我看来,这是所有可能的解决方案中最紧凑的..

于 2013-09-12T10:30:55.890 回答
2

WSConnection在定义的对象旁边创建一个局部变量:

var connectionInstance;

// ... {
WSConnection: function() {
   return connectionInstance || connectionInstance = new Connection();
},
// ... }

如果对象本身是一个类,则使用“私有类”变量代替 ( this.connectionInstance)。

于 2013-09-12T10:31:38.187 回答
1

如果此用例特定于WSConnection函数,请使用惰性(或非惰性——适合您自己)初始化的全局:

var _instance = null;  // you can also just create the singleton instance here (eager/non-lazy initialization)

WSConnection: function() {
   if (!_instance)
       _instance = new Connection();
   return _instance;
}

但是,如果这完全是类的内在品质,请将Connection其变成单例;有几种方法可以做到这一点(例如 Java 将如何做到这一点),但由于 Javascript 是一种灵活的语言,我会这样做:

Connection = new Connection()  // do this at a global scope

现在您将只使用Connection获取单个全局实例而不是new Connection;这也意味着您可能不再需要该WSConnection功能。此外,这确保没有任何东西能够创建另一个实例Connection(如果这是你需要的,那就是)

于 2013-09-12T10:31:41.780 回答
1

预先创建实例。您可以将包含对象包装在一个函数中,以便实例变量不是全局的:

var someobj = (function() {

  var instance = new Connection();

  return {

    WSConnection: function() {
      return instance;
    }

  };

})();

或者使用惰性创建,即在第一次使用时创建它:

var someobj = (function() {

  var instance = null;

  return {

    WSConnection: function() {
      if (instance == null) {
        instance = new Connection();
      }
      return instance;
    }

  };

})();
于 2013-09-12T10:32:09.543 回答
0
WSConnection: (function(){
    var instance = null;
    return function() {
       if( !instance ){
           instance = new Connection();
       }
       return instance;
    };
})()
于 2013-09-12T10:32:08.677 回答