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 相关文章推荐
javascript 对象定义方法 简单易学
Mar 22 Javascript
javascript窗口宽高,鼠标位置,滚动高度(详细解析)
Nov 18 Javascript
jquery常用特效方法使用示例
Apr 25 Javascript
node.js中的http.request方法使用说明
Dec 14 Javascript
jQuery中 delegate使用的问题
Jul 03 Javascript
java中String类型变量的赋值问题介绍
Mar 23 Javascript
jQuery实现区域打印功能代码详解
Jun 17 Javascript
微信小程序 wx.request方法的异步封装实例详解
May 18 Javascript
vue.js 2.*项目环境搭建、运行、打包发布的详细步骤
May 01 Javascript
详解vue为什么要求组件模板只能有一个根元素
Jul 22 Javascript
echarts实现获取datazoom的起始值(包括x轴和y轴)
Jul 20 Javascript
vue实现树状表格效果
Dec 29 Vue.js
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
针对初学PHP者的疑难问答(2)
2006/10/09 PHP
Zend Framework动作助手(Zend_Controller_Action_Helper)用法详解
2016/03/05 PHP
php使用curl通过代理获取数据的实现方法
2016/05/16 PHP
php生成复杂验证码(倾斜,正弦干扰线,黏贴,旋转)
2018/03/12 PHP
改写一个简单的菜单 弹性大小
2010/12/02 Javascript
修改file按钮的默认样式实现代码
2013/04/23 Javascript
drag-and-drop实现图片浏览器预览
2015/08/06 Javascript
浅谈js对象的创建和对6种继承模式的理解和遐想
2016/10/16 Javascript
详解如何在Angular中快速定位DOM元素
2017/05/17 Javascript
jQuery鼠标移动图片上实现放大效果
2017/06/25 jQuery
微信小程序实现复选框效果
2018/12/28 Javascript
vue动态禁用控件绑定disable的例子
2019/10/28 Javascript
jQuery实现聊天对话框
2020/02/08 jQuery
Nuxt配置Element-UI按需引入的操作方法
2020/07/06 Javascript
vue项目中使用rem,在入口文件添加内容操作
2020/11/11 Javascript
JS模拟实现京东快递单号查询
2020/11/30 Javascript
[56:35]DOTA2上海特级锦标赛C组小组赛#1 OG VS Archon第二局
2016/02/27 DOTA
让python 3支持mysqldb的解决方法
2017/02/14 Python
利用Python自带PIL库扩展图片大小给图片加文字描述的方法示例
2017/08/08 Python
Python数据处理numpy.median的实例讲解
2018/04/02 Python
python自定义函数实现最大值的输出方法
2019/07/09 Python
python增加图像对比度的方法
2019/07/12 Python
Python项目 基于Scapy实现SYN泛洪攻击的方法
2019/07/23 Python
Python实现井字棋小游戏
2020/03/09 Python
pytorch SENet实现案例
2020/06/24 Python
在HTML5中使用MathML数学公式的简单讲解
2016/02/19 HTML / CSS
前端实现弹幕效果的方法总结(包含css3和canvas的实现方式)
2018/07/12 HTML / CSS
软件测试有哪些?什么是配置项?
2012/02/12 面试题
在校硕士自我鉴定
2014/01/23 职场文书
艺术设计专业求职自荐信
2014/05/19 职场文书
暑期培训心得体会
2014/09/02 职场文书
学校党的群众路线教育实践活动个人整改方案
2014/10/31 职场文书
工厂仓管员岗位职责
2015/04/01 职场文书
实验室安全管理制度
2015/08/05 职场文书
Redis如何一键部署脚本
2021/04/12 Redis
MySQL数据库压缩版本安装与配置详细教程
2021/05/21 MySQL