&和使用JavaScript& AngularJs模块

时间:2016-01-26 22:30:41

标签: javascript angularjs module revealing-module-pattern

以下代码显示了JavaScript模块(显示模式):

var module = (function(){

    var _privateMethod = function(){
      //code here
    }

    var publicMethod = function(){
      //code here
    }

    return {
       publicMethod: publicMethod
    }

})();

上述揭示模块模式具有很多优点,例如:

  1. 提供公共&私有方法(封装)
  2. 应用程序功能可分为多个模块
  3. 将来更容易扩展和调试
  4. 到目前为止,我一直在我的应用程序中使用上述模块模式,并且工作正常

    现在我正在尝试在我的应用中使用 AngularJs 。令我困惑的是如何使用Angular Modules和JavaSscript Modules(见上文)一起

    普通的JavaScript模块(见上文)提供了封装,这非常重要,因为JavaScript本身不包含私有&公共特征。

    所以我的问题是在使用angularJs模块时是否有使用JavaScript模块的任何意义?

    我应该将应用功能划分为angularJS模块吗?

    我们定义的角度模块之间是否有任何区别?上面显示的JavaScript模块模式?

    我认为术语"模块"令我困惑。如果这个问题看起来过于宽泛,我会道歉,但即使尝试解释这个问题对我来说也很难。

1 个答案:

答案 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即可。