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

Difference between using a module pattern and instantiating new objects

本文关键字:对象 之间 区别 新对象 模块 模式 实例化      更新时间:2023-09-26

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

如果你不想使用原型,以上内容是没有问题的。然而,如果您这样做了,那么如果没有第二个示例所受益的新范围,就无法拥有私有变量。

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

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