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 相关文章推荐
Javascript中找到子元素在父元素内相对位置的代码
Jul 21 Javascript
JQuery入门——用映射方式绑定不同事件应用示例
Feb 05 Javascript
jQuery自动切换/点击切换选项卡效果的小例子
Aug 12 Javascript
jquery购物车实时结算特效实现思路
Sep 23 Javascript
JavaScript 变量、作用域及内存
Apr 08 Javascript
JS实现带圆弧背景渐变效果的导航菜单代码
Oct 13 Javascript
jQuery获取父元素节点、子元素节点及兄弟元素节点的方法
Apr 14 Javascript
touch.js 拖动、缩放、旋转 (鼠标手势)功能代码
Feb 04 Javascript
centos 上快速搭建ghost博客方法分享
May 23 Javascript
JQuery的加载和选择器用法简单示例
May 13 jQuery
分享一个vue项目“脚手架”项目的实现步骤
May 26 Javascript
JavaScript中isPrototypeOf函数
Nov 07 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
MySQL数据库转移,access,sql server 转 MySQL 的图文教程
2007/09/02 PHP
优化PHP程序的方法小结
2012/02/23 PHP
PHP的Yii框架入门使用教程
2016/02/15 PHP
简单谈谈PHP面向对象之标识对象
2017/06/27 PHP
php打开本地exe程序,js打开本地exe应用程序,并传递相关参数方法
2018/02/06 PHP
取键盘键位ASCII码的网页
2007/07/30 Javascript
基于JQuery的访问WebService的代码(可访问Java[Xfire])
2010/11/19 Javascript
11款新鲜的jQuery插件[附所有demo下载]
2011/01/24 Javascript
jquery 中多条件选择器,相对选择器,层次选择器的区别
2012/07/03 Javascript
如何使用jQUery获取选中radio对应的值(一句代码)
2013/06/03 Javascript
js判断undefined类型示例代码
2014/02/10 Javascript
javaScript语法总结
2016/11/25 Javascript
详解AngularJS用Interceptors来统一处理HTTP请求和响应
2017/06/08 Javascript
JS小球抛物线轨迹运动的两种实现方法详解
2017/12/20 Javascript
详解微信小程序审核不通过的解决方法
2018/01/17 Javascript
Bootstrap popover 实现鼠标移入移除显示隐藏功能方法
2018/01/24 Javascript
VUE.CLI4.0配置多页面入口的实现
2019/11/25 Javascript
TensorFlow实现Softmax回归模型
2018/03/09 Python
Python解决线性代数问题之矩阵的初等变换方法
2018/12/12 Python
Python实现简单查找最长子串功能示例
2019/02/26 Python
Python实现的读取文件内容并写入其他文件操作示例
2019/04/09 Python
pytorch加载自定义网络权重的实现
2020/01/07 Python
python mysql 字段与关键字冲突的解决方式
2020/03/02 Python
python实现FTP循环上传文件
2020/03/20 Python
python解释器安装教程的方法步骤
2020/07/02 Python
利用CSS3的transform做的动态时钟效果
2011/09/21 HTML / CSS
一家外企的面试题目(C/C++面试题,C语言面试题)
2014/03/24 面试题
内业资料员岗位职责
2014/01/04 职场文书
面试后的英文感谢信
2014/02/01 职场文书
土木工程专业推荐信
2014/02/19 职场文书
平安建设工作方案
2014/06/02 职场文书
教室标语大全
2014/06/21 职场文书
2014年大学生职业规划书:未来不是梦,只要勇敢冲!
2014/09/22 职场文书
毕业生银行实习自我鉴定
2014/10/14 职场文书
成品仓库管理员岗位职责
2015/04/09 职场文书
Redis读写分离搭建的完整步骤
2021/09/14 Redis