我一直在研究为我的团队制定标准化的Javascript编码风格。现在大多数资源推荐使用"模块(Module)"模式,该模式涉及闭包,例如:
var Module = function() {
someMethod = function() { /* ... */ };
return {
someMethod: someMethod
};
}();
这种方法可以像这样调用:Module.someMethod();
。这种方法似乎仅适用于在传统OOP上下文中将会是静态的方法,例如存储库类以获取/保存数据、服务层以进行外部请求等。除非我漏掉了什么,否则模块模式并不适用于数据类(例如 DTO),这些类通常需要从服务方法传递到 UI 粘合代码。
我经常听到人们提到的一个共同的好处是,通过模块模式,您可以在 Javascript 中拥有真正的私有方法和字段,但是使用“经典”的 Javascript 样式也可以实现这一点,与此同时,还可以拥有静态或实例方法,类似于这样:
myClass = function(param) {
// this is completely public
this.publicProperty = 'Foo';
// this is completely private
var privateProp = param;
// this function can access the private fields
// AND can be called publicly; best of both?
this.someMethod = function() {
return privateProp;
};
// this function is private. FOR INTERNAL USE ONLY
function privateMethod() {
/* ... */
};
}
// this method is static and doesn't require an instance
myClass.staticMethod = function() { /* ... */ };
// this method requires an instance and is the "public API"
myClass.prototype.instanceMethod = function() { /* ... */ };
所以我想问的是,模块模式相比传统风格有什么优势?它可能更加简洁,但这似乎是唯一显而易见的好处;事实上,传统风格似乎提供了真正的封装能力(类似于Java或C#等真正的面向对象语言),而不仅仅是返回一组仅限于静态方法的集合。
我有什么遗漏吗?
var Module = function() { function Module() {}; Module.prototype.whatever = function() {}; return Module }();
- Jamund Ferguson