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 相关文章推荐
jQuery Jcrop插件实现图片选取功能
Nov 23 Javascript
javascript 函数及作用域总结介绍
Nov 12 Javascript
解析JavaScript中delete操作符不能删除的对象
Dec 03 Javascript
Javascript显示和隐藏ul列表的方法
Jul 15 Javascript
jquery验证邮箱格式并显示提交按钮
Nov 07 Javascript
javascript和jQuery实现网页实时聊天的ajax长轮询
Jul 20 Javascript
javascript创建含数字字母的随机字符串方法总结
Aug 01 Javascript
浅谈javascript中执行环境(作用域)与作用域链
Dec 08 Javascript
Angular.js 4.x中表单Template-Driven Forms详解
Apr 25 Javascript
react-native中ListView组件点击跳转的方法示例
Sep 30 Javascript
微信小程序实现全国机场索引列表
Jan 31 Javascript
vue移动端微信授权登录插件封装的实例
Aug 28 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
Ext.data.PagingMemoryProxy分页一次性读取数据的实现代码
2010/04/07 PHP
一个PHP并发访问实例代码
2012/09/06 PHP
php发送与接收流文件的方法
2015/02/11 PHP
php带抄送和密件抄送的邮件发送方法
2015/03/20 PHP
PHP实现四种基础排序算法的运行时间比较(推荐)
2016/08/11 PHP
JavaScript中Object和Function的关系小结
2009/09/26 Javascript
javascript中最常用的继承模式 组合继承
2010/08/12 Javascript
基于jquery的一个OutlookBar类,动态创建导航条
2010/11/19 Javascript
JavaScript 原型继承
2011/12/26 Javascript
JS代码同步文本框内容的实例方法
2013/07/12 Javascript
html+javascript实现可拖动可提交的弹出层对话框效果
2013/08/05 Javascript
js实现模拟银行卡账号输入显示效果
2015/11/18 Javascript
工作中比较实用的JavaScript验证和数据处理的干货(经典)
2016/08/03 Javascript
PHP捕捉异常中断的方法
2016/10/24 Javascript
浅谈通过JS拦截 pushState和replaceState事件
2017/07/21 Javascript
jQuery实现的粘性滚动导航栏效果实例【附源码下载】
2017/10/19 jQuery
详解开发react应用最好用的脚手架 create-react-app
2018/04/24 Javascript
详解React-Router中Url参数改变页面不刷新的解决办法
2018/05/08 Javascript
node.JS路径解析之PATH模块使用方法详解
2020/02/06 Javascript
vue等两个接口都返回结果再执行下一步的实例
2020/09/08 Javascript
[03:11]DOTA2上海特锦赛小组赛第一日recap精彩回顾
2016/02/28 DOTA
python验证码识别教程之利用投影法、连通域法分割图片
2018/06/04 Python
Python使用Pickle库实现读写序列操作示例
2018/06/15 Python
python实现名片管理系统
2018/11/29 Python
使用python绘制温度变化雷达图
2019/10/18 Python
python mock测试的示例
2020/10/19 Python
The Hut美国/加拿大:英国领先的豪华在线百货商店
2019/03/26 全球购物
法学院方阵解说词
2014/01/29 职场文书
宣传活动总结范文
2014/07/01 职场文书
企业总经理助理岗位职责
2014/09/12 职场文书
个人公司授权委托书范本
2014/10/12 职场文书
学校工会工作总结2015
2015/05/19 职场文书
导游词之无锡华莱坞
2019/12/02 职场文书
python基础之//、/与%的区别详解
2022/06/10 Python
浅谈为什么我的 z-index 又不生效了
2022/07/15 HTML / CSS
MySQL的表级锁,行级锁,排它锁和共享锁
2022/07/15 MySQL