使用Javascript模块模式,返回包含接口的裸对象的优点/缺点是什么,而不是创建包含接口的命名对象,然后返回引用?示例代码如下。我总是把接口放到一个命名对象中,我看到的一个优点是我可以在返回它之前做一些调试。
function bareObjectModule() {
return {
method1: function() {}
//etc.
}
}
function namedObjectModule() {
var namedObjectModule = {
method1: function() {}
}
//debug here?
return namedObjectModule;
}
答案 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
)并定义一个对象文字(并提出一个名称)作为奖励。