Javascript模块模式

时间:2011-12-11 15:48:54

标签: javascript

下面有什么区别:

function test(){
    this.init=function(){//do something}
    this.some=function(){//do something}
    function other(){}
}

function test(){
    function init(){//do something}
    function some(){//do something}
    function other(){}

    return {'init':init, 'some':some};
}

感谢您的解释。

2 个答案:

答案 0 :(得分:6)

第一个例子:

var object = new test();
object.init();

第二个例子:

var object = text(); // no new
object.init();

答案 1 :(得分:4)

正如迈克已经指出的那样,他们需要调用的方式有所不同(第一个版本需要new而第二个版本不需要)。

也就是说,如果将它们用于实际模块(而不仅仅是对象)并且模块中的函数相互调用则会产生差异。

在第二种情况下,函数可以直接相互引用(静态绑定)。

function init(){
    some(17);
}

但在第一种情况下,他们会通过this

通过动态绑定互相引用
this.init = function(){
    this.some(17); 
}

这意味着在第一种情况下(使用this),init函数必须始终被调用为module.init()并且不能传递给回调

setTimeout( module.init, 1000 );
//this line will does not work with the `this.init` variation
//but will work fine in the second version

因为我不喜欢像第二个版本那样重新输入功能名称,所以我个人更喜欢在我的模块中使用以下样式:

var module = (function(){

    var M = {}; //private namespace.
                //decouples from the actual name and I
                //can always use the same letter (for consistency)

    M.init = function(){
        M.some(17);
    };

    M.some = function(){
        //
    }

    function other(){ ... }

    return M;
}());