JavaScript单例模式和'this'

时间:2013-05-21 11:03:09

标签: 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();

和这样的代码(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)内。

3 个答案:

答案 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