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 相关文章推荐
ajax上传时参数提交不更新等相关问题
Dec 11 Javascript
时间戳转换为时间 年月日时间的JS函数
Aug 19 Javascript
jQuery使用height()获取高度需要注意的地方
Dec 13 Javascript
基于Flowplayer打造一款免费的WEB视频播放器附源码
Sep 06 Javascript
javascript图片预加载完整实例
Dec 10 Javascript
Javascript 实现全屏滚动实例代码
Dec 31 Javascript
利用js判断手机是否安装某个app的多种方案
Feb 13 Javascript
js与jQuery实现的用户注册协议倒计时功能实例【三种方法】
Nov 09 jQuery
微信小程序使用gitee进行版本管理
Sep 20 Javascript
写gulp遇到的ES6问题详解
Dec 03 Javascript
Js生成随机数/随机字符串的方法小结【5种方法】
May 27 Javascript
微信小程序反编译的实现
Dec 10 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读取csv文件内容的详解
2013/06/18 PHP
如何使用php判断服务器是否是HTTPS连接
2013/07/05 PHP
php验证码生成代码
2015/11/11 PHP
thinkPHP下ueditor的使用方法详解
2015/12/26 PHP
Yii Framework框架开发微信公众平台示例
2020/04/26 PHP
js或css实现滚动广告的几种方案
2010/01/28 Javascript
使用CSS样式position:fixed水平滚动的方法
2014/02/19 Javascript
javascript中cookie对象用法实例分析
2015/01/30 Javascript
js完美实现@提到好友特效(兼容各大浏览器)
2015/03/16 Javascript
JS版元素周期表实现方法
2015/08/05 Javascript
浅谈layer的iframe弹窗给里面的标签赋值的问题
2016/11/10 Javascript
Bootstrap文件上传组件之bootstrap fileinput
2016/11/25 Javascript
JS限定手机版中图片大小随分辨率自动调整的方法
2016/12/05 Javascript
ES6新特性五:Set与Map的数据结构实例分析
2017/04/21 Javascript
Vue的elementUI实现自定义主题方法
2018/02/23 Javascript
js中对象和面向对象与Json介绍
2019/01/21 Javascript
Vue 权限控制的两种方法(路由验证)
2019/08/16 Javascript
使用layer弹窗提交表单时判断表单是否输入为空的例子
2019/09/26 Javascript
jQuery实现可编辑的表格
2019/12/11 jQuery
ant-design表单处理和常用方法及自定义验证操作
2020/10/27 Javascript
Python编程之gui程序实现简单文件浏览器代码
2017/12/08 Python
Python cookbook(数据结构与算法)找到最大或最小的N个元素实现方法示例
2018/02/13 Python
Python实现批量执行同目录下的py文件方法
2019/01/11 Python
python 调用钉钉机器人的方法
2019/02/20 Python
python实现抠图给证件照换背景源码
2019/08/20 Python
python绘制无向图度分布曲线示例
2019/11/22 Python
Django 权限管理(permissions)与用户组(group)详解
2020/11/30 Python
Python爬虫爬取ts碎片视频+验证码登录功能
2021/02/22 Python
美国中西部家用医疗设备商店:Med Mart(轮椅、踏板车、升降机等)
2019/04/26 全球购物
XML文档面试题
2015/08/05 面试题
新学期教师寄语
2014/04/02 职场文书
助人为乐道德模范事迹材料
2014/08/16 职场文书
2014-2015学年工作总结
2014/11/27 职场文书
交通安全主题班会
2015/08/12 职场文书
2016师德师风学习心得体会
2016/01/12 职场文书
python 爬取豆瓣网页的示例
2021/04/13 Python