在阅读了很多有关单例模式的文章并进行一些测试后,我发现像这样的单例模式 (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();
他们都只需要创建一个对象实例,两者都可以拥有“私有”成员,无论哪个,
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
中)。