Javascript模块:返回一个裸对象,或者命名它
Javascript modules: return a bare object, or name it
使用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
),并且定义一个对象文字(并提出一个名称)作为额外的好处。
相关文章:
- 做<img>或者<画布>保存对原始(大)dataUrl对象的引用
- 未能构造'Blob':提供的第一个参数为null,或者是无效的Array对象
- 将页面元素索引到 JSON 对象?或者jQuery选择器它每次
- <嵌入>或者<对象>标签视频播放错误处理程序-JavaScript
- 对象的对象?或者可能是嵌套对象?在 JavaScript 中
- Concat 对象不起作用,或者我需要将值转换为正确的格式
- 最好导出一个包含函数的对象,或者只导出ES6中的多个函数(有约定吗?)
- 创建新对象?或者重用现有的
- angular会将我的对象推到作用域之外,或者将对象与我的提供程序合并
- 对于对象属性检测,我应该使用'在'或者'hasOwnProperty'
- 直接从javascript调用java类,而不使用<苹果>或者<对象>
- 使用<对象>或者<iframe>在链接中
- Javascript模块:返回一个裸对象,或者命名它
- 抵消().在IE7中top给出错误:offset().Top为空或者不是对象
- IE错误'是null或者不是一个对象
- AngularJS忽略被监视对象中的键,或者重写$watch监听器
- 数组和对象之间的区别在javascript?或者数组Vs对象
- 在JavaScript对象字面量中,我应该引用'this'或者变量名
- 我们来看看ember/ember-data对象的生命周期如何?或者调试Ember.js和Ember-Data的提示/提示
- 如何在angular js中访问freemarker对象,或者我可以用angular代替freemarker吗?