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 相关文章推荐
WebGame《逆转裁判》完整版 代码下载(1月24日更新)
Jan 29 Javascript
JavaScript 动态将数字金额转化为中文大写金额
May 14 Javascript
js onclick事件传参讲解
Nov 06 Javascript
JavaScript使用FileSystemObject对象写入文本文件内容的方法
Aug 05 Javascript
jQuery实现一个简单的轮播图
Feb 19 Javascript
解析vue中的$mount
Dec 21 Javascript
深入理解react-router 路由的实现原理
Sep 26 Javascript
Javascript中parseInt的正确使用方式
Oct 17 Javascript
详解三种方式解决vue中v-html元素中标签样式
Nov 22 Javascript
node.js事件轮询机制原理知识点
Dec 22 Javascript
使用vue实现HTML页面生成图片的方法
Mar 12 Javascript
Vue-cli打包后部署到子目录下的路径问题说明
Sep 02 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
php allow_url_include的应用和解释
2010/04/22 PHP
本地机apache配置基于域名的虚拟主机详解
2013/08/10 PHP
PHP中strnatcmp()函数“自然排序算法”进行字符串比较用法分析(对比strcmp函数)
2016/01/07 PHP
Laravel 手动开关 Eloquent 修改器的操作方法
2019/12/30 PHP
IE6中使用position导致页面变形的解决方案(js代码)
2011/01/09 Javascript
从零开始学习jQuery (三) 管理jQuery包装集
2011/02/23 Javascript
从零开始学习jQuery (四) jQuery中操作元素的属性与样式
2011/02/23 Javascript
window.requestAnimationFrame是什么意思,怎么用
2013/01/13 Javascript
禁止iframe页面的所有js脚本如alert及弹出窗口等
2014/09/03 Javascript
基于jQuery实现动态搜索显示功能
2016/05/05 Javascript
JS实现的图片预览插件与用法示例【不上传图片】
2016/11/25 Javascript
JS类的定义与使用方法深入探索
2016/11/26 Javascript
JavaScript制作简易计算器(不用eval)
2017/02/05 Javascript
Bootstrap表单使用方法详解
2017/02/17 Javascript
3分钟掌握常用的JS操作JSON方法总结
2017/04/25 Javascript
12个非常有用的JavaScript技巧
2017/05/17 Javascript
详解vue-cli 接口代理配置
2017/12/13 Javascript
原生JS实现列表子元素顺序反转的方法分析
2018/07/02 Javascript
JS面向对象编程实现的Tab选项卡案例详解
2020/03/03 Javascript
vue 解决在微信内置浏览器中调用支付宝支付的情况
2020/11/09 Javascript
JS代码实现页面切换效果
2021/01/10 Javascript
python算法学习之基数排序实例
2013/12/18 Python
python获取本机mac地址和ip地址的方法
2015/04/29 Python
100行Python代码实现自动抢火车票(附源码)
2018/01/11 Python
python实现生命游戏的示例代码(Game of Life)
2018/01/24 Python
python实现本地图片转存并重命名的示例代码
2018/10/27 Python
python2和python3在处理字符串上的区别详解
2019/05/29 Python
浅析python函数式编程
2020/09/26 Python
python 调用Google翻译接口的方法
2020/12/09 Python
韩国爱茉莉太平洋化妆品美国站:Amore Pacific US
2016/10/28 全球购物
九年级物理教学反思
2014/01/29 职场文书
董事长助理岗位职责
2015/02/11 职场文书
国庆节慰问信
2015/02/15 职场文书
2016国庆节67周年寄语
2015/12/07 职场文书
Nginx访问日志及错误日志参数说明
2021/03/31 Servers
MySQL数据库优化之通过索引解决SQL性能问题
2022/04/10 MySQL