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

Val*_*ion 7 javascript module-pattern

我正在尝试重构一些javascript,我对模块模式感到困惑.

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

var Foo = function(){
    this.Bar = {};
    ...
}
Run Code Online (Sandbox Code Playgroud)

并创建一个在组件中使用的新实例.但我也读过有关模块模式的内容,我看不出与我所拥有的相比有什么好处,因为它似乎只是以更复杂的方式做同样的事情.也许我只是没有遇到过使它成为更好选择的情况.例如,这样的模式:

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();
Run Code Online (Sandbox Code Playgroud)

与我已经拥有的东西没有明显不同.这种模式让我做了什么,我不能做其他方式?

MrC*_*ode 3

两者之间的主要区别在于第一个示例,如果您想使用原型,则不能拥有私有变量和函数。您可以拥有私有变量和函数,但前提是您的公共属性和方法是通过将它们附加到this.

具有私有变量和函数的示例 1:

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

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

    this.publicProperty = 1;

    this.publicFunction = function(){
        console.log(privateVar);
    }
}
Run Code Online (Sandbox Code Playgroud)

如果你不想使用原型,上面的内容也没有问题。但是,如果您这样做,那么如果没有第二个示例受益的新作用域,就无法拥有私有变量。

正如您所看到的,您必须在构造函数中包含所有内容,而在第二个示例中,您可以将构造函数保留为仅用于初始化变量。

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