始终返回相同的类实例

时间:2013-09-12 10:28:28

标签: javascript

我有这个功能:

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

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

5 个答案:

答案 0 :(得分:3)

可能是:

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

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

答案 1 :(得分:1)

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

var connectionInstance;

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

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

答案 2 :(得分:1)

如果此用例特定于WSConnection函数,请使用lazily(或非lazily-suit)自己初始化的全局:

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的另一个实例(如果这是你需要的那个,那就是)

答案 3 :(得分: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;
    }

  };

})();

答案 4 :(得分:0)

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