JavaScript单例模式和'this'

Zem*_*nik 6 javascript

在阅读了很多关于单例模式的文章并进行了一些测试后,我发现像这样的单例模式没有区别(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();
Run Code Online (Sandbox Code Playgroud)

和这样的代码(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();
Run Code Online (Sandbox Code Playgroud)

它们都只生成一个对象实例,它们都可以有"私有"成员,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();
Run Code Online (Sandbox Code Playgroud)

具有正确使用的优点that,但不是单身人士.

我的问题是:这三种方法的总体优势和劣势是什么?(如果重要的话,我正在使用Dojo 1.9开发一个Web应用程序,所以无论哪种方式,这个对象都将在Dojo中require).

Jan*_*nen 1

我认为前两者之间实际上并没有太大的区别。

第一个的getInstance行为更像是 Java 等经典 OOP 语言中的单例模式。

第二种方法的行为更像是经典 OOP 语言中的静态类。

显然,这两个问题都是所有单身人士所面临的问题(如果你在谷歌上查找的话,有大量的材料)。

最后一种方法甚至没有真正使用new- 您从“构造函数”返回一个对象。显然,这根本不是单例,因此,这将是首选方法。