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检测对象中是否存在某个属性判断方法小结
May 19 Javascript
jQuery 的全选(全非选)即取得被选中的值使用介绍
Nov 12 Javascript
Jquery 实现checkbox全选方法
Jan 28 Javascript
如何防止JavaScript自动插入分号
Nov 05 Javascript
JavaScript中闭包的写法和作用详解
Jun 29 Javascript
JavaScript实现的鼠标响应颜色渐变效果完整实例
Feb 18 Javascript
vue2实现可复用的轮播图carousel组件详解
Nov 27 Javascript
JavaScript实现图片放大镜效果
Jun 27 Javascript
Vue路由前后端设计总结
Aug 06 Javascript
layui table 列宽百分比显示的实现方法
Sep 28 Javascript
JavaScript计算出两个数的差值
Mar 19 Javascript
在Vue中使用CSS3实现内容无缝滚动的示例代码
Nov 27 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之第五天
2006/10/09 PHP
php实现将数组转换为XML的方法
2015/03/09 PHP
php curl 获取https请求的2种方法
2015/04/27 PHP
PHP终止脚本运行三种实现方法详解
2020/09/01 PHP
用JavaScript仿PS里的羽化效果代码
2011/12/20 Javascript
jQuery中json对象的复制方式介绍(数组及对象)
2013/06/08 Javascript
Jquery解析Json格式数据过程代码
2014/10/17 Javascript
BootStrap无限级分类(无限极分类封装版)
2016/08/26 Javascript
Bootstrap modal 多弹窗之叠加引起的滚动条遮罩阴影问题
2017/02/27 Javascript
详解nodejs express下使用redis管理session
2017/04/24 NodeJs
Vue.js上下滚动加载组件的实例代码
2017/07/17 Javascript
vue2中引用及使用 better-scroll的方法详解
2018/11/15 Javascript
seajs和requirejs模块化简单案例分析
2019/08/26 Javascript
javascript json对象小技巧之键名作为变量用法分析
2019/11/11 Javascript
Vue CLI4 Vue.config.js标准配置(最全注释)
2020/06/05 Javascript
详解JavaScript作用域、作用域链和闭包的用法
2020/09/03 Javascript
[01:02:48]2018DOTA2亚洲邀请赛小组赛 A组加赛 Newbee vs Liquid
2018/04/03 DOTA
[01:10:57]Liquid vs OG 2018国际邀请赛小组赛BO2 第一场 8.16
2018/08/17 DOTA
python的三目运算符和not in运算符使用示例
2014/03/03 Python
Python实现遍历windows所有窗口并输出窗口标题的方法
2015/03/13 Python
Python连接数据库学习之DB-API详解
2017/02/07 Python
十个Python练手的实战项目,学会这些Python就基本没问题了(推荐)
2019/04/26 Python
python GUI库图形界面开发之PyQt5状态栏控件QStatusBar详细使用方法实例
2020/02/28 Python
基于Python3读写INI配置文件过程解析
2020/07/23 Python
Python 开发工具通过 agent 代理使用的方法
2020/09/27 Python
创业计划书撰写原则
2014/01/25 职场文书
学期自我评价
2014/01/27 职场文书
幼儿园保教管理制度
2014/02/03 职场文书
《美丽的彩虹》教学反思
2014/02/25 职场文书
幼儿园亲子活动总结
2014/04/26 职场文书
动漫设计与制作专业推荐信
2014/07/07 职场文书
三好生演讲稿
2014/09/12 职场文书
关于工作经历的证明书
2014/10/11 职场文书
OpenCV图像变换之傅里叶变换的一些应用
2021/07/26 Python
一条 SQL 语句执行过程
2022/03/17 MySQL
python创建字典及相关管理操作
2022/04/13 Python