JavaScript模块模式与使用构造函数中定义的方法的构造函数

Fer*_*gal 10 javascript constructor module-pattern

从单个实例和多实例的角度来看,为什么我会在模块模式之后编写所有那些额外的代码行,而只是使用带有在构造函数体中定义的方法和属性的标准构造函数?

模块模式示例:http://jsfiddle.net/T3ZJE/1/

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();

console.log(my_module)
Run Code Online (Sandbox Code Playgroud)


构造函数示例:http://jsfiddle.net/EuvaS/2/

function Module(){

    // private variables and functions
    var foo = 'bar';

    //public methods
    this.something = function () {

    }        
}

var my_module = new Module();

console.log(my_module);
Run Code Online (Sandbox Code Playgroud)

对我来说,最终的结果几乎是一样的.两者都可以具有公共属性和方法,两者都可以具有"私有"变量和可以由公共方法访问的方法.

两者都将为单例定义一次公共/原型方法,两者都将为对象的多个实例/克隆定义多次.

我错过了什么吗?有什么不同?

Dam*_*amp 16

在第一个示例中,foo将是所有module()实例共有的静态变量.意思是,所有实例都将引用相同的变量.

在第二个示例中,每个Module()实例的foo都不同.

除此之外,我认为没有任何区别.

  • 这确实是一个重要的区别。 (2认同)
  • 对于poops和giggles,对Constructor方法的这种轻微修改将创建静态私有变量并且只允许它们定义我们的公共方法一次,同时允许它们访问构造函数范围中的所有私有变量:http://jsfiddle.net/zHwQX/2/ (2认同)