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

我试图重构一些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);
    }
}

如果你不想使用原型,以上是没有问题的。 然而,如果你这样做,没有私有变量的方法,没有你的第二个例子从中受益的新范围。

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

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

链接地址: http://www.djcxy.com/p/23201.html

上一篇: Difference between using a module pattern and instantiating new objects

下一篇: Map and reduce/fold over HList of scalaz.Validation