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

时间:2012-11-28 18:15:03

标签: 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)


构造函数示例: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);

对我而言,最终结果几乎是一样的。两者都可以有公共属性和方法,两者都可以有“私有”变量和方法,可以通过公共方法访问。

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

我错过了什么吗?有什么区别?

2 个答案:

答案 0 :(得分:16)

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

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

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

答案 1 :(得分:0)

没有什么特别的区别。但是我不确定这个例子中模块模式的重点是什么。您不需要在模块中包含构造函数。构造函数应该像第二种样式一样使用。但最好在其原型对象中定义方法,除非您需要为每个实例提供它。

再次就目的而言,我认为这里的模块模式不是正确的方式。