Javascript/Node JS创建单例对象的最佳方法

Javascript/Node JS创建单例对象的最佳方法,javascript,node.js,Javascript,Node.js,我完成了家庭作业,取得了完美的成绩。但我只想检查一下,这是创建单例实例的最佳方法还是其他方法: 我使用模块模式(闭包)创建了一个单例对象,如“app.js” 实际的单例对象(singleton.js): 然后是单例对象用户1(singletonUser1.js): 单例对象用户2(singletonUser2.js) 请考虑,单用户1和用户2是根据我的项目的目的,以上只是现实世界问题的一个原型。 我的问题是,我确信这是在创建该类的单个实例(正如我使用上面的app.js检查的那样)。但这是最好的方

我完成了家庭作业,取得了完美的成绩。但我只想检查一下,这是创建单例实例的最佳方法还是其他方法:

我使用模块模式(闭包)创建了一个单例对象,如“app.js”

实际的单例对象(singleton.js):

然后是单例对象用户1(singletonUser1.js):

单例对象用户2(singletonUser2.js)

请考虑,单用户1和用户2是根据我的项目的目的,以上只是现实世界问题的一个原型。


我的问题是,我确信这是在创建该类的单个实例(正如我使用上面的app.js检查的那样)。但这是最好的方法吗?

我发现JavaScript中的单例类有点不稳定,在java中很明显,即无论何时创建类的对象,都会得到相同的对象,但在JS中,(至少在IMO中)没有真正的类可以开始。(不,ES6类不算,回答这个问题,你能在其中包含私有属性吗?)

您编写的代码只是一个闭包,很可能是下面的代码,没有任何区别:

var localvariable = 10;

function getlocalvariable() {
    console.dir('This is getInstance');
    return localvariable;
};
function setlocalvariable(value) {
    console.dir('This is setlocalvariable');
    localvariable = value;
};
module.exports = {
  getlocalvariable: getlocalvariable,
  setlocalvariable: setlocalvariable
};
这就是说,一天结束时,单例只是一种模式,我们如何实现取决于我们自己,你们所做的并没有什么特别的错误

编辑:由比我更了解JS的人实现的单例实现(摘自)

var Singleton=(函数(){
函数Singleton(){
this.localVariable=5;
}
//对象可以像通常一样具有实例方法。
Singleton.prototype.getLocalVariable=函数(){
返回this.localVariable;
};
var实例;
返回函数(){
如果(!实例){
instance=newsingleton();
}
返回实例;
};
})();
var instance1=new Singleton();
var instance2=new Singleton();
console.log(instance1==instance2);//真的
console.log(instance1.localVariable,instance2.localVariable);//5 5
instance1.localVariable=20;
console.log(instance1.localVariable,instance2.localVariable);//20 20

console.log(instance1.getLocalVariable());//20
这是我的服务配置单例

功能AdService(名称){
log('newinstance created');
this.name=name | |“defaultName”;
this.greet=函数(){
console.log('hi'+this.name);
}
};
函数Singleton(){
this.instance=null;
this.getInstance=函数getInstance(名称){
如果(!this.instance)
this.instance=新的ADSService(名称);
返回此.instance;
}
}
var singleton=新singleton();
module.exports=函数(名称){
返回singleton.getInstance(名称);

}
您可能会更幸运地将此发布在,因为您不是在要求解决问题。@Arcanecaraeda是的,您是对的,我不是在要求解决问题,我将尝试发布代码审查论坛。但是,我的要求是知道,他们的方法是否比使用闭包更好,还想知道一些调试技术,比如,如何在运行时验证有多少特定对象的实例是他们的。你可能会在这里得到答案,但你会有更多的运气和更好的那边!这不利于代码审查,因为它不是真实的、实现的代码,而是假设的。因为这个原因,这将在CR上关闭。@Phrancis啊,说得好。然后我收回我的陈述。这可能更接近于家庭作业,因为你可以在JavaScript中使用私有属性(变量),这不是你熟悉的语法:-这是旧的。还有:@vol7ron,我在谈论ES6类中的私有属性:)没有关键字,正如您在Java或C中所期望的那样,但是仍然存在上面描述的方法,它具有相同的影响(隐藏在闭包后面的变量)。还有其他改进ECMAScript 6语法的建议,但正如您所说,目前没有一个可以轻松实现私有化属性/方法——当然没有易于阅读的内容。@vol7ron nope,我是说没有办法编写带有私有属性的纯ES6类……我不明白如何回答您的问题。我可以很容易地说。网上有不同的例子,很多都使用weakmap。这里有一个:但我同意,私有化是有问题的,需要更多的强调。
var singleton = (function () {
    var localvariable = 10;

    return {
        getlocalvariable: function () {
            console.dir('This is getInstance');
            return localvariable;
        },
        setlocalvariable: function (value) {
            console.dir('This is setlocalvariable');
            localvariable = value;
        },
    };
})();

module.exports = singleton;
var singletonUser1 = (function () {
    var singleton = require('./singleton');

    return {
        getlocalvariable: function () {
            console.dir('This is singletonUser1---getlocalvariable');
            return singleton.getlocalvariable();
        },
        setlocalvariable: function (value) {
            console.dir('This is singletonUser1---setlocalvariable');
            singleton.setlocalvariable(value);
        },
    };
})();

module.exports = singletonUser1;
var singletonUser2 = (function () {
    var singleton = require('./singleton');

    return {
        getlocalvariable: function () {
            console.dir('This is singletonUser2222---getlocalvariable');
            return singleton.getlocalvariable();
        },
        setlocalvariable: function (value) {
            console.dir('This is singletonUser22222---setlocalvariable');
            singleton.setlocalvariable(value);
        },
    };
})();
module.exports = singletonUser2;
var localvariable = 10;

function getlocalvariable() {
    console.dir('This is getInstance');
    return localvariable;
};
function setlocalvariable(value) {
    console.dir('This is setlocalvariable');
    localvariable = value;
};
module.exports = {
  getlocalvariable: getlocalvariable,
  setlocalvariable: setlocalvariable
};
var mySingleton = (function () {

  // Instance stores a reference to the Singleton
  var instance;

  function init() {

    // Singleton

    // Private methods and variables
    function privateMethod(){
        console.log( "I am private" );
    }

    var privateVariable = "Im also private";

    var privateRandomNumber = Math.random();

    return {

      // Public methods and variables
      publicMethod: function () {
        console.log( "The public can see me!" );
      },

      publicProperty: "I am also public",

      getRandomNumber: function() {
        return privateRandomNumber;
      }

    };

  };

  return {

    // Get the Singleton instance if one exists
    // or create one if it doesn't
    getInstance: function () {

      if ( !instance ) {
        instance = init();
      }

      return instance;
    }

  };

})();

var myBadSingleton = (function () {

  // Instance stores a reference to the Singleton
  var instance;

  function init() {

    // Singleton

    var privateRandomNumber = Math.random();

    return {

      getRandomNumber: function() {
        return privateRandomNumber;
      }

    };

  };

  return {

    // Always create a new Singleton instance
    getInstance: function () {

      instance = init();

      return instance;
    }

  };

})();


// Usage:

var singleA = mySingleton.getInstance();
var singleB = mySingleton.getInstance();
console.log( singleA.getRandomNumber() === singleB.getRandomNumber() ); // true

var badSingleA = myBadSingleton.getInstance();
var badSingleB = myBadSingleton.getInstance();
console.log( badSingleA.getRandomNumber() !== badSingleB.getRandomNumber() ); // true

// Note: as we are working with random numbers, there is a
// mathematical possibility both numbers will be the same,
// however unlikely. The above example should otherwise still
// be valid.