Javascript 这两种模块模式之间的差异

Javascript 这两种模块模式之间的差异,javascript,Javascript,这两种JavaScript模块模式在功能上有什么不同吗 var MODULE = (function() { var privvy = "I'm private!"; return { getPublic: function() { return "I'm public"; }, getPriv: function() { return privvy;

这两种JavaScript模块模式在功能上有什么不同吗

var MODULE = (function() {

    var privvy = "I'm private!";

    return {
        getPublic: function() {
            return "I'm public";
        },      
        getPriv: function() {
            return privvy;
        }       
    };
}());

我认为现在发生的是,在第一种情况下,显式声明一个包含两个公共成员的对象,然后返回。其中一个成员有一个函数作为一个值,该值引用了“private”变量(即,立即执行的函数形成了闭包,但getPublic()方法在该函数完成执行后仍然可以访问该变量-我想)

在第二种方法中,通过匿名构造函数创建一个对象,匿名构造函数将两个函数分配给可公开访问的变量,IEF创建闭包,以相同的方式限制对priv变量的访问


这两种变化会导致完全相同的对象吗?

它们在功能上没有什么不同。
模块
对象的工作方式与上述两种方式相同,但首选第一种方式,因为语法更简洁。无需
新建

证实了这一点。对于第二种模式,它抱怨
返回新函数(){
是一种“奇怪的构造”


编辑:正如@zzzzBov和@Bergi所指出的,关于对象的原型存在差异。请查看他们的答案以获得详细解释。

这两个版本的差异非常小。为了便于参考,我添加了基本格式的简单示例(版本a和版本B).功能上没有显著差异,但是版本B增加了一个额外的范围层:

var foo; //global scope
var module = (function () {
    var foo; //module scope
    return new function () {
        var foo; //inner scope
    };
}());
此外,在版本A中返回的对象原型将是
object.prototype
,而在版本B中,原型将是匿名函数的原型

这一差异可以从下面的例子中看出


版本A本质上是以下内容的简写:

var module = (function () {
    var temp;
    temp = new Object();
    temp.foo = function () {...};
    return temp;
}());
var module = (function () {
    function anon() {
        this.foo = function () {...};
    }
    return new anon();
}());
B版基本上是以下内容的简写:

var module = (function () {
    var temp;
    temp = new Object();
    temp.foo = function () {...};
    return temp;
}());
var module = (function () {
    function anon() {
        this.foo = function () {...};
    }
    return new anon();
}());

版本A 版本B
结果没有太大差别,除了第二个示例中的对象有一个指向匿名函数的(不可数)原型属性“构造函数”。这意味着,您可以使用
new MODULE.constructor
创建它的副本

创建单例对象时,首选第一种语法。第二个示例通常不使用
new
关键字,将构造函数作为
MODULE
返回,以便您可以创建它的实例,并访问相同的(“static”)
priv
变量

你可以加入另一个结果类似的模式:

var MODULE = new function() {
    var priv = "I'm private!";
    this.getPublic = function() {
        return "I'm public";
    };
    this.getPriv = function() {
        return priv;
    };
}();

它的行为更像您的第一个示例,但是泄漏了一个创建新的
priv
变量的构造函数,而不是共享静态变量。

第二个版本添加了一个额外的作用域,返回的对象有一个额外的匿名原型,而第一个版本的原型是
object.prototype
@zzbov Good点,但是没有标准化的方法来访问匿名对象的原型吗?谢谢@zzzbov。您所指的其他作用域是什么?是否存在匿名构造函数函数,它是一个新的作用域,而在第一个版本中返回后的块不会创建一个新的作用域?同样,如果声明了构造函数在第二个版本中匿名,这是否意味着我们将无法访问该构造函数的原型?
var MODULE = new function() {
    var priv = "I'm private!";
    this.getPublic = function() {
        return "I'm public";
    };
    this.getPriv = function() {
        return priv;
    };
}();