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 相关文章推荐
Prototype ObjectRange对象学习
Jul 19 Javascript
JS中动态添加事件(绑定事件)的代码
Jan 09 Javascript
浮动的div自适应居中显示的js代码
Dec 23 Javascript
jQuery 动态云标签插件
Nov 11 Javascript
js数组依据下标删除元素
Apr 14 Javascript
编写高性能Javascript代码的N条建议
Oct 12 Javascript
JavaScript tab选项卡插件实例代码
Feb 23 Javascript
Bootstrap每天必学之模态框(Modal)插件
Apr 26 Javascript
基于javascript实现按圆形排列DIV元素(一)
Dec 02 Javascript
解决vue-cli创建项目的loader问题
Mar 13 Javascript
Vue 实时监听窗口变化 windowresize的两种方法
Nov 06 Javascript
VUE路由动态加载实例代码讲解
Aug 26 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购物车实现代码
2011/10/10 PHP
php微信开发之百度天气预报
2016/11/18 PHP
详解PHP发送邮件知识点
2018/05/06 PHP
PHP sdk实现在线打包代码示例
2020/12/09 PHP
表单切换,用回车键替换Tab健(不支持IE)
2011/07/20 Javascript
jquery ajax return没有返回值的解决方法
2011/10/20 Javascript
THREE.JS入门教程(4)创建粒子系统
2013/01/24 Javascript
浅析JavaScript中的变量复制、参数传递和作用域链
2016/01/13 Javascript
javascript cookie的简单应用
2016/02/24 Javascript
Angular的MVC和作用域
2016/12/26 Javascript
微信小程序 MD5加密登录密码详解及实例代码
2017/01/12 Javascript
Js apply方法详解
2017/02/16 Javascript
详解单页面路由工程使用微信分享及二次分享解决方案
2019/02/22 Javascript
Vue组件内部实现一个双向数据绑定的实例代码
2019/04/04 Javascript
js blob类型url的视频下载问题的解决
2019/11/29 Javascript
如何在Node和浏览器控制台中打印彩色文字
2020/01/09 Javascript
基于js实现逐步显示文字输出代码实例
2020/04/02 Javascript
JavaScript使用setTimeout实现倒计时效果
2021/02/19 Javascript
浅谈python中np.array的shape( ,)与( ,1)的区别
2018/06/04 Python
Django密码系统实现过程详解
2019/07/19 Python
Python实现子类调用父类的初始化实例
2020/03/12 Python
基于python爬取有道翻译过程图解
2020/03/31 Python
Numpy中np.max的用法及np.maximum区别
2020/11/27 Python
挪威户外活动服装和装备购物网站:Bergfreunde挪威
2016/10/20 全球购物
法律专业推荐信范文
2013/11/29 职场文书
小学感恩教育活动总结
2014/07/07 职场文书
国家机关领导干部民主生活会对照检查材料思想汇报
2014/09/17 职场文书
离婚协议书标准格式
2014/10/04 职场文书
用人单位终止解除劳动合同证明书
2014/10/06 职场文书
人生遥控器观后感
2015/06/11 职场文书
埃及王子观后感
2015/06/16 职场文书
体育部部长竞选稿
2015/11/21 职场文书
导游词之天津盘山
2019/11/01 职场文书
关于python爬虫应用urllib库作用分析
2021/09/04 Python
mysql 排序失效
2022/05/20 MySQL
Win11怎么添加用户?Win11添加用户账户的方法
2022/07/15 数码科技