Javascript模块:返回一个裸对象,或命名它

时间:2011-12-15 12:21:22

标签: javascript module

使用Javascript模块模式,返回包含接口的裸对象的优点/缺点是什么,而不是创建包含接口的命名对象,然后返回引用?示例代码如下。我总是把接口放到一个命名对象中,我看到的一个优点是我可以在返回它之前做一些调试。

function bareObjectModule() {
    return {
        method1: function() {}
        //etc.
    }
}

function namedObjectModule() {
    var namedObjectModule = {
        method1: function() {}
    }

    //debug here?
    return namedObjectModule;
}

3 个答案:

答案 0 :(得分:3)

直接返回接口的主要优点是它很短并且不包含很多样板,但是具有命名引用的功能要强得多,并且允许其他原本无法使用的模式。最大的优点是,如果您对模块有参考,那么让函数更容易相互引用

var M = {};
M.f1 = function(){ ... };

M.f2 = function(){  M.f1() }; //functions can reference each other without
                              // a fragile dynamic binding through `this`

M.f3 = some_combinator(M.f2); //since you are not limited to defining things as 
                              //property-value pairs you have much more flexibility..

return M;

答案 1 :(得分:2)

除了你提到的调试优势之外,我认为这两种方法没有任何区别。由于namedObjectModule是函数local,因此一旦函数返回(即堆栈中的变量名),它将被丢弃。

一个小问题可能是,对于一个命名对象,将有一个局部变量'namedObjectModule'的堆栈条目(一旦函数返回就会弹出),并且函数调用堆栈中会有一个条目(为了恢复工作而去同一个对象。使用裸露的物体,可以避免前者。不确定这是否会对性能产生任何影响,除非堆栈中有数千个对象。

答案 2 :(得分:1)

主要区别在于,使用引用的对象,您可以使用属性并从其他方法调用方法。你不能用一个对象文字做到这一点。

作为两种方法的替代方法,您可以将封闭函数作为构造函数(使用new)调用,并让它返回this对象以导出模块。

var myModule = new function () {
    this.methodA = function () { /* ... */ }

    this.methodB = function () { /* ... */ }

    console.log(this) // debug
}

无需显式键入return(构造函数默认返回this)并定义一个对象文字(并提出一个名称)作为奖励。