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 相关文章推荐
ExtJS下grid的一些属性说明
Dec 13 Javascript
js实现下拉框选择要显示图片的方法
Feb 16 Javascript
使用Jasmine和Karma对AngularJS页面程序进行测试
Mar 05 Javascript
bootstrap读书笔记之CSS组件(上)
Oct 17 Javascript
Bootstrap源码解读下拉菜单(4)
Dec 23 Javascript
Vue数据驱动模拟实现2
Jan 11 Javascript
angularJS利用ng-repeat遍历二维数组的实例代码
Jun 03 Javascript
自制简易打赏功能的实例
Sep 02 Javascript
JavaScript定义函数的三种实现方法
Sep 23 Javascript
JS document form表单元素操作完整示例
Jan 13 Javascript
Javascript异步执行不按顺序解决方案
Apr 30 Javascript
vue Treeselect下拉树只能选择第N级元素实现代码
Aug 31 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数据结构与算法(PHP描述) 查找与二分法查找
2012/06/21 PHP
Linux下从零开始安装配置Nginx服务器+PHP开发环境
2015/12/21 PHP
PHP正则表达式过滤html标签属性(DEMO)
2016/05/04 PHP
PHP开发api接口安全验证操作实例详解
2020/03/26 PHP
javascript笔记 String类replace函数的一些事
2011/09/22 Javascript
javascript学习笔记(三) String 字符串类型介绍
2012/06/19 Javascript
jquery validate添加自定义验证规则(验证邮箱 邮政编码)
2013/12/04 Javascript
js字符串转换成数字与数字转换成字符串的实现方法
2014/01/08 Javascript
基于NodeJS的前后端分离的思考与实践(五)多终端适配
2014/09/26 NodeJs
node.js中的http.get方法使用说明
2014/12/14 Javascript
你所不了解的javascript操作DOM的细节知识点(一)
2015/06/17 Javascript
jquery马赛克拼接翻转效果代码分享
2015/08/24 Javascript
nodejs 中模拟实现 emmiter 自定义事件
2016/02/22 NodeJs
【经典源码收藏】jQuery实用代码片段(筛选,搜索,样式,清除默认值,多选等)
2016/06/07 Javascript
JavaScript利用闭包实现模块化
2017/01/13 Javascript
详解Vue组件之间的数据通信实例
2017/06/17 Javascript
最全的JavaScript开发工具列表 总有一款适合你
2017/06/29 Javascript
node实现简单的反向代理服务器
2017/07/26 Javascript
JavaScript门面模式详解
2017/10/19 Javascript
基于Vue中点击组件外关闭组件的实现方法
2018/03/06 Javascript
如何测量vue应用运行时的性能
2019/06/21 Javascript
vue自动化路由的实现代码
2019/09/30 Javascript
微信小程序停止其他视频播放当前视频的实例代码
2019/12/25 Javascript
Python实现PS滤镜特效Marble Filter玻璃条纹扭曲效果示例
2018/01/29 Python
利用Python如何实现数据驱动的接口自动化测试
2018/05/11 Python
python读取几个G的csv文件方法
2019/01/07 Python
python中Ansible模块的Playbook的具体使用
2020/05/28 Python
Python尾递归优化实现代码及原理详解
2020/10/09 Python
英超联赛的首选足球:Mitre足球
2019/05/06 全球购物
大学生军训广播稿
2014/01/24 职场文书
大学毕业寄语大全
2014/04/10 职场文书
领导班子四风问题对照检查材料
2014/09/27 职场文书
大雁塔英文导游词
2015/02/10 职场文书
2015年调度员工作总结
2015/04/30 职场文书
运动会闭幕式主持词
2015/07/01 职场文书
幼儿园国培研修日志
2015/11/13 职场文书