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 相关文章推荐
JScript的条件编译
May 29 Javascript
JavaScript Cookie 直接浏览网站分网址
Dec 08 Javascript
自己实现string的substring方法 人民币小写转大写,数字反转,正则优化
Sep 02 Javascript
用正则表达式替换图片地址img标签
Nov 22 Javascript
IE下支持文本框和密码框placeholder效果的JQuery插件分享
Jan 31 Javascript
全面解析Bootstrap中transition、affix的使用方法
May 30 Javascript
jQuery Layer弹出层传值到父页面的实现代码
Aug 17 jQuery
原生JS实现图片无缝滚动方法(附带封装的运动框架)
Oct 01 Javascript
详解JS取出两个数组中的不同或相同元素
Mar 20 Javascript
JavaScript刷新页面的几种方法总结
Mar 28 Javascript
微信小程序实现上传照片代码实例解析
Aug 04 Javascript
详解Vue中$props、$attrs和$listeners的使用方法
Feb 18 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的sso单点登录实现方法
2015/01/08 PHP
twig模板获取全局变量的方法
2016/02/05 PHP
php封装db类连接sqlite3数据库的方法实例
2017/12/19 PHP
Dom操作之兼容技巧分享
2011/09/20 Javascript
深入理解JavaScript系列(9) 根本没有“JSON对象”这回事!
2012/01/15 Javascript
jQuery ReferenceError: $ is not defined 错误的处理办法
2013/05/10 Javascript
js原生appendChild的bug解决心得分享
2013/07/01 Javascript
Javascript中封装window.open解决不兼容问题
2014/09/28 Javascript
javascript继承机制实例详解
2014/11/20 Javascript
仿JQuery输写高效JSLite代码的一些技巧
2015/01/13 Javascript
JavaScript设计模式之单体模式全面解析
2016/09/09 Javascript
AngularJS中的按需加载ocLazyLoad示例
2017/01/11 Javascript
js编写简单的聊天室功能
2017/08/17 Javascript
JS通过位运算实现权限加解密
2018/08/14 Javascript
React 项目迁移 Webpack Babel7的实现
2018/09/12 Javascript
Node.js EventEmmitter事件监听器用法实例分析
2019/01/07 Javascript
js实现点击按钮随机生成背景颜色
2020/09/05 Javascript
[01:13:17]Secret vs NB 2018国际邀请赛小组赛BO2 第二场 8.19
2018/08/21 DOTA
Python随手笔记第一篇(2)之初识列表和元组
2016/01/23 Python
Python subprocess模块详细解读
2018/01/29 Python
对Python中列表和数组的赋值,浅拷贝和深拷贝的实例讲解
2018/06/28 Python
Django中使用Celery的教程详解
2018/08/24 Python
python找出因数与质因数的方法
2019/07/25 Python
Python collections模块使用方法详解
2019/08/28 Python
Python通过cv2读取多个USB摄像头
2019/08/28 Python
Python格式化输出--%s,%d,%f的代码解析
2020/04/29 Python
使用CSS3配合IE滤镜实现渐变和投影的效果
2015/09/06 HTML / CSS
美国男女折扣服饰百货连锁店:Stein Mart
2017/05/02 全球购物
Abbacino官网:包、钱包和女士配饰
2019/04/15 全球购物
linux下进程间通信的方式
2014/12/23 面试题
会计电算化学生个人的自我评价
2014/02/08 职场文书
犯错检讨书
2014/02/21 职场文书
党员民主评议总结
2014/10/20 职场文书
2014年会计个人工作总结
2014/11/24 职场文书
小学家庭教育心得体会
2016/01/14 职场文书
初中语文教学反思范文
2016/03/03 职场文书