以下代码显示了JavaScript模块(显示模式):
var module = (function(){
var _privateMethod = function(){
//code here
}
var publicMethod = function(){
//code here
}
return {
publicMethod: publicMethod
}
})();
上述揭示模块模式具有很多优点,例如:
到目前为止,我一直在我的应用程序中使用上述模块模式,并且工作正常
现在我正在尝试在我的应用中使用 AngularJs 。令我困惑的是如何使用Angular Modules和JavaSscript Modules(见上文)一起?
普通的JavaScript模块(见上文)提供了封装,这非常重要,因为JavaScript本身不包含私有&公共特征。
所以我的问题是在使用angularJs模块时是否有使用JavaScript模块的任何意义?
我应该将应用功能划分为angularJS模块吗?
我们定义的角度模块之间是否有任何区别?上面显示的JavaScript模块模式?
我认为术语"模块"令我困惑。如果这个问题看起来过于宽泛,我会道歉,但即使尝试解释这个问题对我来说也很难。
答案 0 :(得分:0)
Angular服务(不是模块)和JS模块(ES6 / CJS / AMD /无论如何)都提供模块化和封装,因此IIFE作为模块模式不需要。
作为Angular中的模块模式的IIFE最常见的用例是防止constant
服务中的可变泄漏,因为它没有获得工厂功能并且不能与其他服务类型互换
app.constant('...', (() => {
var _private = () => { ... };
return { ... };
})());
通过Angular中的函数范围进行封装(以及一般的JS)有一个主要的缺点。 JS中没有对函数作用域的反射,并且在对象中未公开的私有方法无法在测试中进行测试或模拟。
另一个问题是,无法修补或模拟Revealing Module私有方法(通过Angular中的decorator
)。安全性很难从中受益,因为JS中没有安全性,但这会导致重新实现公共方法的WET代码。
TL; DR:只需在对象上公开下划线方法,添加defineProperty
即可。