Javascript中的Module(模块)模式

JavaScript模块是用于保持代码块之间相互独立而普遍使用的设计模式。对于熟悉面向对象语言的人来说,模块是JavaScript的”类”。在JavaScript中Module模式模拟了类的概念,用闭包封装了”私有”状态和方法。

我们用立即执行函数(Immediately-Invoked-Function-Expressions (IIFE)) 创建私有空间,防止其泄露全局作用域。其样子如下:

var myGirlfriend = (function() {

  // 定义私有变量或方法
  var name = '小郑';

  var _kiss = function() {
    console.log('吻');
  }

  var _smile = function() {
    console.log('微笑');
  }

  return {
    // 暴露给公有的变量或方法
    simle: _smile,
    name: name
  }

})();

console.log(myGirlfriend.name); 
myGirlfriend.simle();

console.log(myGirlfriend._simle);
console.log(myGirlfriend._kiss);

/**
 * 结果:
 *     小美
 *     微笑
 *     undefined
 *     undefined
*/

在Module模式内,由于闭包的存在,声明的变量和方法只在模式内部可用,但在返回的对象上定义的变量和方法,在对外部也可用。如上面例子:其他人可以知道我的女朋友的名字,也可以看到我女朋友微笑,但不可以吻我女朋友。

Module模式的优缺点:

优点:

  • 实现代码的封装模块化
  • 实现私有化变量和方法

缺点:

  • 无法应用私有变量,造成无法对私有变量进行单元测试
  • 当我们想改可见性时,实际上要修改每一个曾经使用过该成员的地方。

这里只举例了一种简单Module的设计模式,从Module模式上还衍生出Revealing Module(揭示模块)模式、Singleton(单例)模式。这些模式都很有使用价值,不同当我们的系统中出现了它们,则表示我们能需要评估我们的设计,例如Singleton的存在往往表明系统中的模块要么是系统紧密耦合,要么是其逻辑过于分散在代码库的多个部分中。

    原文作者:内孤
    原文地址: https://www.jianshu.com/p/03c5b939e5d4
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞