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

8

我正在尝试重构一些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();

这个模式似乎与我已经有的东西没有显著区别。这个模式让我能够做什么,以前我不能做到的呢?


1
这个问题在这里有几个很好的答案:https://dev59.com/u2035IYBdhLWcg3wErrM - Hrishi
1个回答

3

这两种方法的关键区别在于,如果你想使用原型,就不能拥有私有变量和函数。但是,如果你将公共属性和方法附加到this构造函数中,就可以拥有私有变量和函数。

示例1中包含一个私有变量和函数:

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

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

    this.publicProperty = 1;

    this.publicFunction = function(){
        console.log(privateVar);
    }
}

如果你不想使用原型,那么以上内容就没有问题。但是,如果你确实需要使用原型,那么没有办法拥有私有变量,除非你使用第二个示例中所受益的新作用域。
如你所见,你必须将所有东西都包含在构造函数内,而第二个示例中,你可以仅仅将构造函数用于初始化变量。
相反,第二个示例中的原型方法超出了构造函数的范围,因此它们无法使用构造函数内的任何变量或函数。原型方法所需的所有函数和变量都必须声明在外部封闭作用域中。

感谢您的澄清,不知道为什么您会被踩 :/ - Valyrion

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接