Javascript/NodeJS是创建单例对象的最佳方式
Javascript / Node JS best way to create singleton object
我完成了家庭作业,取得了完美的成绩。但我只想检查一下,这是创建单例实例的最佳方式还是其他方式:
我使用模块模式(闭包)创建了一个单例对象,即"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对象(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是有目的的,上面只是现实世界问题的原型。
我的问题是,我确信这是在创建类的一个实例(正如我使用上面的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
这是我为服务配置的单例
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中这一点很清楚,即无论何时创建一个类的对象,都会得到相同的对象,但在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的人的单例实现(取自学习JavaScript设计模式)
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.
相关文章:
- 解析以下对象的最佳方式
- Javascript,用vars创建对象的最佳方法
- Javascript.连接两组对象的最佳方式,如SQL
- 返回多个变量的 JavaScript 函数:数组与对象.最佳实践是什么
- 在对象类上实现 jquery 作用域的最佳方法
- 在下划线.js中扩展对象的最佳实践
- Javascript:从数组中删除包含带有侦听器的对象的项目的最佳方法
- 什么'是使输入上禁用的属性与Meteor辅助对象反应的最佳方法
- Angular:将对象存储在服务中以在视图中显示和将crud函数存储到服务器的最佳方式是什么
- 检查链接对象形式中未定义属性的最佳实践是什么
- 用JavaScript编写对象方法的最佳方式是什么
- 迭代JSON对象并将元素打印到屏幕上的最佳方式是什么
- React是装载前处理空对象的最佳方式
- 对对象数组进行分组和排序的最佳方式
- 传单JS面向对象的最佳方法
- 将特性插入到角度控制器中阵列中的对象中的最佳方式
- 创建javascript对象的最佳方式
- 什么'It是声明对象的最佳方式
- 创建 JavaScript 对象最佳实践
- jQuery/JS -在数组中输出对象-最佳实践