JavaScript模块模式实例详解


Posted in Javascript onOctober 25, 2017

本文实例讲述了JavaScript模块模式。分享给大家供大家参考,具体如下:

在JS中没有Class的概念,那么如何体现Object的Public和Private属性呢,答案就是模块模式(Module Pattern)。

JS中有一个显著的特性: 匿名函数(anonymous function),通过匿名函数的建立和执行,匿名函数里的代码就形成了一个闭包(closure),从而形成,封装和控制一个对象的Private和Public的特性,避免了全局变量的泛滥和与其他脚本的冲突。

(function () {
  // 所有的变量和函数只在这个范围内有效
  // 仍然可以使用全局变量
}());

经典的模块模式模板

var myNamespace = (function () {
 var myPrivateVar, myPrivateMethod;
 // A private counter variable
 myPrivateVar = 0;
 // A private function which logs any arguments
 myPrivateMethod = function( foo ) {
   console.log( foo );
 };
 return {
  // A public variable
  myPublicVar: "foo",
  // A public function utilizing privates
  myPublicFunction: function( bar ) {
   // Increment our private counter
   myPrivateVar++;
   // Call our private method using bar
   myPrivateMethod( bar );
  }
 };
})();

通过闭包,可以看到,当我们使用myNamespace时,我们只能看到myPublic*的属性和方法,而myPrivate*的属性和方法是无法直接访问的。

基本模式扩展

Import mixins

JS有一个重要特性叫隐式全局变量,也就是说无论什么时候,JS解释器都对一个变量寻找var声明,如果没有找到,就视为这个变量时全局变量。这样看起来在闭包中使用全局变量时很容易的事,但同时很容易造成代码的混乱。好在匿名函数也可以接收参数,这样通过参数传递,我们可以把想使用的全局变量import到匿名函数中,从而提供一个更清晰干净的使用方法。

(function ($, YAHOO) {
  // 这样就可以访问jQuery (as $) 和 YAHOO 库
}(jQuery, YAHOO));

Module exports

有时候不仅仅使用全局变量,而且也想声明一个自己的全局变量,这可以通过匿名函数的return value轻松实现。

var MODULE = (function () {
  var my = {},
    privateVariable = 1;
  function privateMethod() {
    // ...
  }
  my.moduleProperty = 1;
  my.moduleMethod = function () {
    // ...
  };
  return my;
}());

高级扩展

基于上面的基本模式,我们可以继续扩展。

Augmentation

基本模块模式的限制是我们必须把整个模块放在一个file里,那么当需要把一个模块分散到多个文件时,怎么办呢?

一个号办法就是augment modules。我们首先输入module,然后增加属性方法,然后再输出。例子如下

var MODULE = (function (my) {
  my.anotherMethod = function () {
    // added method...
  };
  return my;
}(MODULE));

Loose  Augmentation

上面的例子需要先有一个Module,然后在此基础上增加新的特性。但有的时候,我们异步加载JS脚本,这样就需要一个低耦合的模块建立方法, 通过如下结构便可实现。

var MODULE = (function (my) {
  // add capabilities...
  return my;
}(MODULE || {}));

Sub-modules

可以基于Module建立Sub modules,这个非常简单,例子如下:

MODULE.sub = (function () {
  var my = {};
  // ...
  return my;
}());

至此,我们简单的介绍了模块模式,该模式作为最经典的JS模式,被各种JS框架广泛使用。它使得你的代码封装性更强,结构化更合理,更OOP。

更多关于JavaScript相关内容可查看本站专题:《javascript面向对象入门教程》、《JavaScript切换特效与技巧总结》、《JavaScript查找算法技巧总结》、《JavaScript错误与调试技巧总结》、《JavaScript数据结构与算法技巧总结》、《JavaScript遍历算法与技巧总结》及《JavaScript数学运算用法总结》

希望本文所述对大家JavaScript程序设计有所帮助。

Javascript 相关文章推荐
一个很酷的拖动层的js类,兼容IE及Firefox
Jun 23 Javascript
ExtJs 表单提交登陆实现代码
Aug 19 Javascript
javascript限制用户只能输汉字中文的方法
Nov 20 Javascript
jQuery中unbind()方法用法实例
Jan 19 Javascript
jQuery实现带滑动条的菜单效果代码
Aug 26 Javascript
jquery mobile界面数据刷新的实现方法
May 28 Javascript
AngularJS解决ng-if中的ng-model值无效的问题
Jun 21 Javascript
JS 实现百度搜索功能
Feb 01 Javascript
VUE2.0+Element-UI+Echarts封装的组件实例
Mar 02 Javascript
vue自定义tap指令及tap事件的实现
Sep 18 Javascript
JavaScript学习笔记之图片库案例分析
Jan 08 Javascript
JavaScript封闭函数及常用内置对象示例
May 13 Javascript
vue生成token保存在客户端localStorage中的方法
Oct 25 #Javascript
AngularJS实现的获取焦点及失去焦点时的表单验证功能示例
Oct 25 #Javascript
浅析为什么a="abc" 不等于 a=new String("abc")
Oct 25 #Javascript
vue语法之拼接字符串的示例代码
Oct 25 #Javascript
浅谈Vue.nextTick 的实现方法
Oct 25 #Javascript
纯html+css+javascript实现楼层跳跃式的页面布局(实例代码)
Oct 25 #Javascript
浅谈Node.js之异步流控制
Oct 25 #Javascript
You might like
PHP5中的this,self和parent关键字详解教程
2007/03/19 PHP
PHP下载远程图片并保存到本地方法总结
2016/01/22 PHP
50个优秀经典PHP算法大集合 附源码
2020/08/26 PHP
表单填写时用回车代替TAB的实现方法
2007/10/09 Javascript
10个实用的脚本代码工具
2010/05/04 Javascript
深入理解JavaScript定时机制
2010/10/29 Javascript
jQuery登陆判断简单实现代码
2013/04/21 Javascript
js拼接html注意问题示例探讨
2014/07/14 Javascript
Windows8下搭建Node.js开发环境教程
2014/09/03 Javascript
利用Vue.js实现求职在线之职位查询功能
2017/07/03 Javascript
JavaScript贪吃蛇小组件实例代码
2017/08/20 Javascript
vue请求本地自己编写的json文件的方法
2019/04/25 Javascript
vue+web端仿微信网页版聊天室功能
2019/04/30 Javascript
微信小程序项目总结之记账小程序功能的实现(包括后端)
2019/08/20 Javascript
vue项目引入ts步骤(小结)
2019/10/31 Javascript
解决vue的过渡动画无法正常实现问题
2019/10/31 Javascript
详解小程序如何动态绑定点击的执行方法
2019/11/26 Javascript
JS中的模糊查询功能
2019/12/08 Javascript
浅谈python中列表、字符串、字典的常用操作
2017/09/19 Python
不管你的Python报什么错,用这个模块就能正常运行
2018/09/14 Python
Python语言快速上手学习方法
2018/12/14 Python
Python collections中的双向队列deque简单介绍详解
2019/11/04 Python
django实现类似触发器的功能
2019/11/15 Python
python将四元数变换为旋转矩阵的实例
2019/12/04 Python
python编程进阶之类和对象用法实例分析
2020/02/21 Python
Python之字符串的遍历的4种方式
2020/12/08 Python
SEPHORA新西兰官方网站:购买化妆品和护肤品
2016/12/02 全球购物
美国运动鞋和服装网上商店:YCMC
2018/09/15 全球购物
会计系中文个人求职信
2013/12/24 职场文书
领导班子“四风问题”“整改方案
2014/10/02 职场文书
单位法人授权委托书范本
2014/10/09 职场文书
如何在Python项目中引入日志
2021/05/31 Python
教你利用Nginx 服务搭建子域环境提升二维地图加载性能的步骤
2021/09/25 Servers
用Python可视化新冠疫情数据
2022/01/18 Python
JavaScript架构localStorage特殊场景下二次封装操作
2022/06/21 Javascript
MySQL 原理与优化之原数据锁的应用
2022/08/14 MySQL