我一直在研究为我的团队提出标准化的 Javascript 编码风格。现在大多数资源推荐涉及闭包的“模块”模式,如下所示:
var Module = function() {
someMethod = function() { /* ... */ };
return {
someMethod: someMethod
};
}();
并像这样调用它Module.someMethod();
。这种方法似乎只适用于传统 OOP 上下文中静态的方法,例如用于获取/保存数据的存储库类、用于发出外部请求的服务层等。除非我错过了什么,否则模块模式并不打算与通常需要在服务方法之间传递到 UI 粘合代码的数据类(例如 DTO)一起使用。
我看到引用的一个常见好处是,您可以使用模块模式在 Javascript 中拥有真正的私有方法和字段,但这也可以实现随着能够有静电or具有“经典”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# 等真正的 OOP 语言),而不是简单地返回纯静态方法的集合。
我有什么遗漏的吗?
模块模式可用于创建原型,另请参阅:
var Module = function() {
function Module() {};
Module.prototype.whatever = function() {};
return Module
}();
var m = new Module();
m.whatever();
正如另一位发帖者所说,干净的全局命名空间就是其原因。然而,实现此目的的另一种方法是使用 AMD 模式,它还解决了依赖管理等其他问题。它还将所有内容包装在某种封闭中。这是一个很棒的AMD简介 http://addyosmani.com/writing-modular-js/它代表异步模块定义。
我也推荐阅读JavaScript 模式 http://shop.oreilly.com/product/9780596806767.do因为它彻底涵盖了各种模块模式的原因。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)