Javascript / Node JS最好的方法来创build单例对象

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

我使用模块模式(闭包)创build了一个单例对象作为“app.js”

var singleton1 = require('./singletonUser1'); console.dir(singleton1.getlocalvariable()); singleton1.setlocalvariable(20); console.dir(singleton1.getlocalvariable()); var singleton2 = require('./singletonUser2'); console.dir(singleton2.getlocalvariable()); singleton2.setlocalvariable(30); console.dir(singleton.getlocalvariable()); 

实际单身人士对象(singleton.js):

 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; 

然后Singleton对象用户1(singletonUser1.js):

 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; 

Singleton对象用户2(singletonUser2.js)

 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; 

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

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

 var Singleton = (function(){ function Singleton(){ this.localVariable = 5; } // Object can have instance methods as usually. Singleton.prototype.getLocalVariable = function() { return this.localVariable; }; var instance; return function() { if (!instance) { instance = new Singleton(); } return instance; }; })(); var instance1 = new Singleton(); var instance2 = new Singleton(); console.log(instance1 === instance2); // true console.log(instance1.localVariable, instance2.localVariable); // 5 5 instance1.localVariable = 20; console.log(instance1.localVariable, instance2.localVariable); // 20 20 console.log(instance1.getLocalVariable()); // 20 

这是我可configuration的服务单身人士

 function AdService(name) { console.log('new instance created'); this.name = name || 'defaultName'; this.greet = function () { console.log('hi ' + this.name); } }; function Singleton() { this.instance = null; this.getInstance = function getInstance(name) { if (!this.instance) this.instance = new AdService(name); return this.instance; } } var singleton = new Singleton(); module.exports = function (name) { return singleton.getInstance(name); } 

我发现JavaScript中的singleton类有点摇摆不定,在java中很清楚,即每当创build一个类的对象时,就会得到相同的对象,但是在JS中(至lessIMO)没有真正的类。 (没有,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 }; 

也就是说,单日结束时,Singleton只是一个模式,我们如何实现取决于我们,没有什么特别的错误,你做的方式。

编辑:由一个比我更了解JS的人执行的单例实现(来自学习JavaScriptdevise模式 )

 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.