Javascript 使用模块模式和实例化新对象之间的区别

Javascript 使用模块模式和实例化新对象之间的区别,javascript,module-pattern,Javascript,Module Pattern,我试图重新构造一些javascript,但对模块模式感到困惑 我现在有一种方法,就是简单地声明一个类,其中包含一个组件的所有功能 var Foo = function(){ this.Bar = {}; ... } 并创建一个新实例以在组件中使用。但我也读过关于模块模式的书,我看不出与我所拥有的相比有什么好处,因为它似乎做了同样的事情,只是以一种更复杂的方式。也许我只是没有遇到这样的情况,使它成为一个更好的选择。 例如,这样的模式: var module = (function

我试图重新构造一些javascript,但对模块模式感到困惑

我现在有一种方法,就是简单地声明一个类,其中包含一个组件的所有功能

var Foo = function(){
    this.Bar = {};
    ...
}
并创建一个新实例以在组件中使用。但我也读过关于模块模式的书,我看不出与我所拥有的相比有什么好处,因为它似乎做了同样的事情,只是以一种更复杂的方式。也许我只是没有遇到这样的情况,使它成为一个更好的选择。 例如,这样的模式:

var module = (function () {
    // private variables and functions
    var foo = 'bar';

    // constructor
    var module = function () {
    };

    // prototype
    module.prototype = {
        constructor: module,
        something: function () {
        }
    };

    // return module
    return module;
})();

var my_module = new module();

看起来和我已经拥有的没有太大的不同。这个模式让我做了什么,而我不能用另一种方式做呢?

这两者之间的关键区别是在第一个示例中,如果要使用原型,就不能使用私有变量和函数。您可以拥有私有变量和函数,但前提是您的公共属性和方法是通过将它们附加到
this
而在构造函数中创建的

示例1使用私有变量和函数:

var Foo = function(){
    var privateVar = "priv";

    function privateFunction(){
        console.log(privateVar);   
    }

    this.publicProperty = 1;

    this.publicFunction = function(){
        console.log(privateVar);
    }
}
如果您不想使用原型,以上内容没有问题。但是,如果您这样做了,那么如果没有第二个示例所受益的新范围,就无法拥有私有变量

正如您所看到的,您必须在构造函数中包含所有内容,而第二个示例中,您可以只为初始化变量而离开构造函数


相反,第二个示例中的原型方法超出了构造函数的范围,因此它们不能在构造函数中使用函数的任何变量。原型方法所需的所有函数和变量都必须在外部闭包范围内声明。

这个问题有几个很好的答案:感谢澄清,我不知道你为什么被否决了:/