在阅读了很多关于单身模式的文章并进行了一些测试之后,我发现像这样的单例模式没有区别(http://jsfiddle.net/bhsQC/1/):
var TheObject = function () {
var instance;
function init() {
var that = this;
var foo = 1;
function consoleIt() {
console.log(that, foo);
}
return {
bar: function () {
consoleIt()
}
};
}
return {
getInstance: function () {
if (!instance) {
instance = init();
}
return instance;
}
};
}();
var myObject = TheObject.getInstance();
myObject.bar();
和这样的代码(http://jsfiddle.net/9Qa9H/3/):
var myObject = function () {
var that = this;
var foo = 1;
function consoleIt() {
console.log(that, foo);
}
return {
bar: function () {
consoleIt();
}
};
}();
myObject.bar();
它们都只生成一个对象的实例,它们都可以拥有" private"成员that
指向其中任何一个中的window
个对象。只是后者更简单。如果我错了,请纠正我。
使用像这样的标准构造函数(http://jsfiddle.net/vnpR7/2/):
var TheObject = function () {
var that = this;
var foo = 1;
function consoleIt() {
console.log(that, foo);
}
return {
bar: function () {
consoleIt();
}
};
};
var myObject = new TheObject();
myObject.bar();
具有正确使用that
的优势,但不是单身人士。
我的问题是:这三种方法的整体优势和劣势是什么?(如果重要的是,我正在使用Dojo 1.9开发Web应用程序,无论哪种方式,这个对象将在Dojo的require
)内。
答案 0 :(得分:3)
嗯,真正的区别在于构建单身人士的时间。第二种方法是立即创建单例,第一种方法是在第一次调用之后。根据单例在内存中的需要,这可能会对您的应用程序产生影响。例如,仅当用户执行某个操作时,您可能只需要单例。因此,如果用户没有这样做,那么最好不要初始化单例。
此外,如果单身人士的初始化计算量很大,那么在你真正需要单身人士之前能够将其推迟是一件好事。
编辑:正如Jani所说,最后一个不是单身,所以我没有讨论。
答案 1 :(得分:1)
我认为前两者之间确实存在很大的实际差异。
第一个getInstance
的行为更像是Java等经典OOP语言中的单例模式。
第二种方法更像是经典OOP语言中的静态类。
显然,这些问题都与所有单身人士都有相同的问题(如果你在谷歌上查找的话,还有很多材料)。
最后一种方法实际上并不是使用new
- 你从“构造函数”返回一个对象。显然,这个不是单身人士,因此,这将是首选方法。
答案 2 :(得分:0)
我喜欢像这样建立单身人士:
function FriendHandler(){
if(FriendHandler.prototype.singleton){
return FriendHandler.prototype.singleton;
}
if(!(this instanceOf FriendHandler)){
return new FriendHandler();
}
FriendHandler.prototype.singleton = this;
...
this.selectFriends = function(firstName){
...
};
}
如果你这样做:
new FriendHandler()
or
FriendHandler()
它总是返回相同的实例。
几个月前我写过这篇文章:http://franciscomsferreira.blogspot.com/2013/01/how-to-write-maintainable-javascript-or.html