Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/433.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaScript单例模式和';这';_Javascript - Fatal编程技术网

JavaScript单例模式和';这';

JavaScript单例模式和';这';,javascript,Javascript,在阅读了大量关于单例模式的文章并进行了一些测试之后,我发现像这样的单例模式之间没有区别(): 代码如下(): 它们都只生成对象的一个实例,它们都可以有“私有”成员,在其中任何一个中指向window对象。只是后者比较简单。如果我错了,请纠正我 像这样使用标准构造函数(): 具有正确使用即的优点,但不是单例 我的问题是:这三种方法的总体优势和劣势是什么?(如果重要的话,我正在使用Dojo 1.9开发一个web应用程序,所以无论哪种方式,这个对象都将在Dojo的require中。)我认为前两种方法在实

在阅读了大量关于单例模式的文章并进行了一些测试之后,我发现像这样的单例模式之间没有区别():

代码如下():

它们都只生成对象的一个实例,它们都可以有“私有”成员,在其中任何一个中指向
window
对象。只是后者比较简单。如果我错了,请纠正我

像这样使用标准构造函数():

具有正确使用即的优点,但不是单例


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

我认为前两种方法在实际应用上没有太大的区别

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

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

显然,这两个问题与所有单身汉都有相同的问题(如果你在谷歌上查找的话,这方面有很多资料)


最后一种方法实际上甚至不是使用
new
——而是从“构造函数”返回一个对象。显然,这一个根本不是单例,因此,将是首选方法。

好吧,真正的区别是单例的构造时间。第二种方法立即创建singleton,第一种方法仅在第一次调用之后才创建。根据单例在内存中的需求,这可能会对应用程序产生影响。例如,只有当用户执行某个操作时,才可能需要单例。因此,如果用户不这样做,那么最好不必初始化单例

此外,如果单例的初始化是计算密集型的,那么将其推迟到真正需要单例时是一件好事


编辑:正如Jani所说,最后一个不是单例,所以我没有讨论它。

我喜欢这样构建单例:

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()
它总是返回相同的实例


几个月前我写过这篇文章:

只是出于好奇,为什么有人会在JavaScript中使用单例模式?使用像:var obj1={}这样的对象是否有意义offtopic@KirillIvlev使用单例/模块模式,您可以在IIFE中拥有私有变量和函数。OP中的单例似乎也应用了延迟加载-仅在第一次调用时实例化。我宁愿简单地使用一个自动调用函数来隐藏构造函数,例如:我真的不明白为什么你想要
指向
窗口
?请看CMS的回答:是的,我错过了明显的施工时间。在我的例子中,这并不重要,因为我使用这种名称空间。这就是为什么我加入了第三个选项,因为我仍然不确定我是否应该使用singleton…好吧,那么,我没有看到任何其他显著的区别。关于你是否应该使用单例,这当然是一个完全不同的讨论:)我准备在这个问题上被否决,但是-单例的“问题”是什么,除了
问题之外?有很多问题,但我就是找不到任何好的答案。这里有一些关于这个的好答案
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();
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()