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

Javascript modules: return a bare object, or name it

本文关键字:对象 或者 一个 模块 返回 Javascript      更新时间:2023-09-26

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

function bareObjectModule() {
    return {
        method1: function() {}
        //etc.
    }
}
function namedObjectModule() {
    var namedObjectModule = {
        method1: function() {}
    }
    //debug here?
    return namedObjectModule;
}

直接返回接口的主要优点是它很短,不包含太多的样板文件,但是有一个命名的引用功能更强大,并且允许使用最初无法使用的其他模式。最大的优点是,如果您有对模块

的引用,则函数之间的引用要容易得多。
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;

除了您提到的调试优势之外,我认为这两种方法没有任何区别。由于namedObjectModule是函数本地的,它无论如何都会在函数返回后被丢弃(即堆栈中的变量名)。

一个小的点可能是,对于命名对象,将有一个局部变量'namedObjectModule'的堆栈条目(将在函数返回时弹出),并且将在函数调用堆栈中有一个条目(对相同对象)返回工作。对于裸物体,前者是可以避免的。不确定这是否有任何真正的性能影响,除非您在堆栈中有数千个对象。

主要区别在于,对于引用对象,您可以使用属性并从其他方法调用方法。对于单个对象字面量,你不能这样做。

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

var myModule = new function () {
    this.methodA = function () { /* ... */ }
    this.methodB = function () { /* ... */ }
    console.log(this) // debug
}

不需要显式地键入return(构造函数默认返回this),并且定义一个对象文字(并提出一个名称)作为额外的好处。