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 相关文章推荐
document.open() 与 document.write()的区别
Aug 13 Javascript
基于jquery的自定义鼠标提示效果 jquery.toolTip
Nov 14 Javascript
浏览器窗口加载和大小改变事件示例
Feb 27 Javascript
Flexigrid在IE下不显示数据的有效处理方法
Sep 04 Javascript
Vue2学习笔记之请求数据交互vue-resource
Feb 23 Javascript
jquery DataTable实现前后台动态分页
Jun 17 jQuery
解决vue单页使用keep-alive页面返回不刷新的问题
Mar 13 Javascript
解决vue中监听input只能输入数字及英文或者其他情况的问题
Aug 30 Javascript
Javascript实现时间倒计时功能
Nov 17 Javascript
微信小程序 获取手机号 JavaScript解密示例代码详解
May 14 Javascript
在vue中实现给每个页面顶部设置title
Jul 29 Javascript
vue脚手架项目创建步骤详解
Mar 02 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中使用Session配合Javascript实现文件上传进度条功能
2014/10/15 PHP
CodeIgniter扩展核心类实例详解
2016/01/20 PHP
PHP实现的自定义图像居中裁剪函数示例【测试可用】
2017/08/11 PHP
国外的为初学者写的JavaScript教程
2008/06/09 Javascript
js获取php变量的实现代码
2013/08/10 Javascript
jQuery.extend()、jQuery.fn.extend()扩展方法示例详解
2014/05/08 Javascript
php,js,css字符串截取的办法集锦
2014/09/26 Javascript
JavaScript监听文本框回车事件并过滤文本框空格的方法
2015/04/16 Javascript
javascript中使用正则表达式清理table样式的代码
2020/04/01 Javascript
javascript解析xml实现省市县三级联动的方法
2015/07/25 Javascript
javascript跨域方法、原理以及出现问题解决方法(详解)
2015/08/06 Javascript
jquery 动态增加,减少input表单的简单方法(必看)
2016/10/12 Javascript
jquery广告无缝轮播实例
2017/01/05 Javascript
Angular1.x自定义指令实例详解
2017/03/01 Javascript
JavaScript使用链式方法封装jQuery中CSS()方法示例
2017/04/07 jQuery
Angular中自定义Debounce Click指令防止重复点击
2017/07/26 Javascript
element-ui循环显示radio控件信息的方法
2018/08/24 Javascript
javascript自定义右键菜单插件
2019/12/16 Javascript
[12:29]2018国际邀请赛 开幕秀
2018/08/22 DOTA
Python:Scrapy框架中Item Pipeline组件使用详解
2017/12/27 Python
详解Python中如何写控制台进度条的整理
2018/03/07 Python
老生常谈python中的重载
2018/11/11 Python
Python3最长回文子串算法示例
2019/03/04 Python
elasticsearch python 查询的两种方法
2019/08/04 Python
python实现单链表的方法示例
2019/09/03 Python
python实现单机五子棋
2020/08/28 Python
python实现模拟器爬取抖音评论数据的示例代码
2021/01/06 Python
深入浅出CSS3 background-clip,background-origin和border-image教程
2011/01/27 HTML / CSS
美国休闲服装品牌:J.Crew Factory
2017/03/04 全球购物
大学生学习党课思想汇报
2014/01/03 职场文书
销售人员求职的自我评价分享
2014/03/15 职场文书
实验心得体会
2014/09/05 职场文书
党员教师群众路线对照检查材料思想汇报
2014/09/29 职场文书
2015年企业新年寄语
2014/12/08 职场文书
SQL Server中交叉联接的用法详解
2021/04/22 SQL Server
python 中的@运算符使用
2021/05/26 Python