![](/img/trans.png)
[英]What is the difference between Modules and Namespaces in TypeScript/JavaScript?
[英]Difference between & usage of JavaScript & AngularJs Modules
下面的代码向您展示一个JavaScript模块(显示模式):
var module = (function(){
var _privateMethod = function(){
//code here
}
var publicMethod = function(){
//code here
}
return {
publicMethod: publicMethod
}
})();
上面的显示模块模式具有很多优点,例如:
到目前为止,我一直在我的应用程序中使用上述模块模式,并且运行良好
现在,我正在尝试在我的应用程序中使用AngularJs 。 事情这就是困惑我是如何使用角模块和使用JavasScript模块(见上文) 在一起吗?
普通的JavaScript模块(请参见上文)提供了封装,这非常重要,因为JavaScript本身不包含私有和公共功能。
所以我的问题是,在使用angularJs模块时,是否可以使用JavaScript模块?
我应该将我的应用程序功能划分为angularJS模块吗?
我们定义的角度模块和上面显示的JavaScript模块模式之间有什么区别吗?
我认为术语“模块”使我感到困惑。 如果这个问题看起来太笼统,我深表歉意,但是即使尝试解释这个问题对我来说也很难。
Angular服务(非模块)和JS模块(ES6 / CJS / AMD /其他)均提供模块化和封装,因此不需要IIFE作为模块模式。
IIFE作为Angular中的模块模式的最常见用例是防止constant
服务中的变量泄漏,因为它没有工厂功能并且不能与其他服务类型互换。
app.constant('...', (() => {
var _private = () => { ... };
return { ... };
})());
在Angular中(通常在JS中)通过函数作用域进行封装有一个主要缺点。 JS中没有函数作用域的反映,并且未在对象上公开的私有方法无法在测试中进行测试或模拟。
另一个问题是,无法对Revealing Module私有方法进行修补或模拟(通过Angular中的decorator
)。 由于JS中没有安全性,因此安全性几乎无法从中受益,但这会导致WET代码重新实现公共方法。
TL; DR:仅暴露对象上强调的方法,添加defineProperty
使其具有品味。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.