Javascript的一种模块模式


Posted in Javascript onSeptember 08, 2010

Douglas Crockford已经传授了一个有用的单例模式(singleton pattern)实现此规则,我认为他的模式有益于你基于YUI的那些应用。Douglas叫它模块模式(module pattern)。它是如下工作的:
1、创建一个命名空间对象:如果你使用YUI,可以用YAHOO.namespace()方法: YAHOO.namespace("myProject");这分配了一个空的myProject对象,是YAHOO的一个成员(如 果myProject已存在的话,则不会被覆盖)。现在我们可以开始添加YAHOO.myProject的成员。
2、对你的命名空间对象分配一个匿名函数返回值:

YAHOO.myProject.myModule = function () { 
return { 
myPublicProperty: "我作为YAHOO.myProject.myModule.myPublicProperty被访问。"; 
myPublicMethod: function () { 
YAHOO.log("我作为YAHOO.myProject.myModule.myPublicMethod被访问。"); 
} 
}; 
}(); // 这个括号导致匿名函数被执行且返回

注意有闭合大括号和紧接着的括号()的最后一行—这种符号导致了匿名函数的立即执行,返回包含myPublicProperty和myPublicMethod的对象。只要这个匿名函数一返回,返回对象就作为YAHOO.myProject.myModule被访问。
3、在匿名函数中,在返回语句前加入“私有”方法和变量。到目前为止,我们只是将myPublicProperty和myPublicMethod直接分配到YAHOO.myProject.myModule中。此外,当我们在返回语句之前放置一些代码时,这个模式还支持被增加的效用。
YAHOO.myProject.myModule = function () { 
//“私有”变量: 
var myPrivateVar = "我仅能在YAHOO.myProject.myModule内被访问。"; 
//私有方法: 
var myPrivateMethod = function () { 
YAHOO.log("我仅能在YAHOO.myProject.myModule内被访问。"); 
} return { 
myPublicProperty: "我作为YAHOO.myProject.myModule.myPublicProperty能被访问。" 
myPublicMethod: function () { 
YAHOO.log("我作为YAHOO.myProject.myModule.myPublicMethod能被访问。"); 
//在myProject,我能访问私有的变量和方法 
YAHOO.log(myPrivateVar); 
YAHOO.log(myPrivateMethod()); 
//myPublicMethod的原生作用域是myProject,我们可以用“this”来访问公共成员。 
YAHOO.log(this.myPublicProperty); 
} 
}; 
}();

在上面的代码中,我们从一个匿名函数返回有两个成员的一个对象。在YAHOO.myProject.myModule内部,可以分别用this.myPublicProperty和this.myPublicMethod来访问。在YAHOO.myProject.myModule外部,公共成员可以用YAHOO.myProject.myModule.myPublicProperty和YAHOO.myProject.myModule.myPublicMethod来访问。
私有变量myPrivateProperty和myPrivateMethod只能被匿名函数本身或返回对象的成员访问。尽管匿名函数会立即执行和终止,但它们依然是保留着,凭借闭包(closure)的力量——通过一个函数的局部变量在这个函数返回后是保留的规则。只要 YAHOO.myProject.myModule需要它们,我们的两个私有变量就不会被销毁。
4、实践这个模式。让我们来看看这个模式的一个常见应用案例。假设你有一个列表,列表上的一些项可以被拖拽。应用拖拽的项上有拖拽的CSS类。
<!--这个脚本文件包含所有的YUI实用程序--> 
<script type="text/javascript" 
src="http://yui.yahooapis.com/2.2.2/build/utilities/utilities.js"></script> 
<ul id="myList"> 
<li class="draggable">一项</li> 
<li>二项</li> <!--二项将不能被拖拽--> 
<li class="draggable">三项</li> 
</ul> 
<script> 
YAHOO.namespace("myProject"); 
YAHOO.myProject.myModule = function () { 
//YUI实用程序的私有简写引用: 
var yue = YAHOO.util.Event, 
yud = YAHOO.util.Dom; 
//私有方法 
var getListItems = function () { 
// 注意这个地方使用其他的私有变量,包括"yud"YAHOO.util.Dom的简写: 
var elList = yud.get("myList"); 
var aListItems = yud.getElementsByClassName( 
"draggable", //得到仅有CSS类"draggable"的项 
"li", //仅返回列表项 
elList //限定搜索改元素的子 
); 
return aListItems; 
}; 
//这个放回的对象将变成YAHOO.myProject.myModule: 
return { 
aDragObjects: [], //可对外访问的,存储DD对象 
init: function () { 
//直到DOM完全加载好,才实现列表项可拖拽: 
yue.onDOMReady(this.makeLIsDraggable, this, true); 
}, 
makeLIsDraggable: function () { 
var aListItems = getListItems(); //我们可以拖拽的那些元素 
for (var i=0, j=aListItems.length; i<j; i++) { 
this.aDragObjects.push(new YAHOO.util.DD(aListItems[i])); 
} 
} 
}; 
}(); 
//上面的代码已经执行,所以我们能立即访问init方法: 
YAHOO.myProject.myModule.init(); 
</script>

这是一个简单的例子,特意写的详细一些——如果按照这种方式做,我们无疑能把它写的更紧凑。当项目变得更加复杂和它的API增加,这个模式缩放的很好。通过这种方式,它避免了全局命名空间,提供了对外的可以访问的API方法,支持受保护或“私有”的数据和方法。
  • [1]原文:《a javascript module pattern》。这是在YUI blog上的,有的地方可能打不开,可以搜一下英文的转载或者利用搜索引擎的缓存也能看。
  • [2]《A JavaScript Module Pattern ? JavaScript的一种模组模式》这是别人的翻译,参考了不少,不过感觉挺不方便看的,这是我翻译的这篇文章的一个原因,当然最主要的原因是这篇文章算是学习YUI的最基础的文章了,整个YUI的模块模式都基于此。
原文地址:http://dancewithnet.com/2007/12/04/a-javascript-module-pattern/
Javascript 相关文章推荐
javascript应用:Iframe自适应其加载的内容高度
Apr 10 Javascript
php gethostbyname获取域名ip地址函数详解
Jan 24 Javascript
用JQuery实现全选与取消的两种简单方法
Feb 22 Javascript
JS中的构造函数详细解析
Mar 10 Javascript
Bootstrap Fileinput文件上传组件用法详解
May 10 Javascript
全面解析bootstrap格子布局
May 22 Javascript
Jquery实现遮罩层的简单实例(就是弹出DIV周围都灰色不能操作)
Jul 14 Javascript
微信小程序 WXML、WXSS 和JS介绍及详解
Oct 08 Javascript
基于jPlayer三分屏的制作方法
Dec 21 Javascript
jQuery插件HighCharts绘制2D金字塔图效果示例【附demo源码下载】
Mar 09 Javascript
Kotlin学习第一步 kotlin语法特性
May 25 Javascript
vue中使用element ui的弹窗与echarts之间的问题详解
Oct 25 Javascript
jQeury淡入淡出需要注意的问题
Sep 08 #Javascript
jQuery之浮动窗口实现代码(两种方法)
Sep 08 #Javascript
Jquery ThickBox插件使用心得(不建议使用)
Sep 08 #Javascript
jquery的Tooltip插件 qtip使用详细说明
Sep 08 #Javascript
jquery的Theme和Theme Switcher使用小结
Sep 08 #Javascript
复制小说文本时出现的随机乱码的去除方法
Sep 07 #Javascript
extjs grid设置某列背景颜色和字体颜色的实现方法
Sep 06 #Javascript
You might like
将word转化为swf 如同百度文库般阅读实现思路及代码
2013/08/09 PHP
PHP中Socket连接及读写数据超时问题分析
2016/07/19 PHP
基于jQuery的简单九宫格实现代码
2012/08/09 Javascript
js获取上传文件大小示例代码
2014/04/10 Javascript
jQuery on()绑定动态元素出现的问题小结
2016/02/19 Javascript
Node.js实现数据推送
2016/04/14 Javascript
JavaScript实现图片懒加载(Lazyload)
2016/11/28 Javascript
Angular2学习教程之组件中的DOM操作详解
2017/05/28 Javascript
js数字滑动时钟的简单实现(示例讲解)
2017/08/14 Javascript
深入理解Vue nextTick 机制
2018/04/28 Javascript
小程序实现横向滑动日历效果
2019/10/21 Javascript
vue和iview实现Scroll 数据无限滚动功能
2019/10/31 Javascript
javascript数组元素删除方法delete和splice解析
2019/12/09 Javascript
webpack+vue.js构建前端工程化的详细教程
2020/05/10 Javascript
在服务器端实现无间断部署Python应用的教程
2015/04/16 Python
在Apache服务器上同时运行多个Django程序的方法
2015/07/22 Python
Python实现新浪博客备份的方法
2016/04/27 Python
Django跨域请求CSRF的方法示例
2018/11/11 Python
pandas修改DataFrame列名的实现方法
2019/02/22 Python
Python3远程监控程序的实现方法
2019/07/15 Python
基于Pycharm加载多个项目过程图解
2020/01/19 Python
Python3 操作 MySQL 插入一条数据并返回主键 id的实例
2020/03/02 Python
Keras:Unet网络实现多类语义分割方式
2020/06/11 Python
Python生成器传参数及返回值原理解析
2020/07/22 Python
Python面向对象特殊属性及方法解析
2020/09/16 Python
如何使用python-opencv批量生成带噪点噪线的数字验证码
2020/12/21 Python
python tkinter实现下载进度条及抖音视频去水印原理
2021/02/07 Python
猎人靴英国官网:Hunter Boots
2017/02/02 全球购物
委托书范本
2014/09/13 职场文书
终止或解除劳动合同及劳动关系的证明书
2014/10/06 职场文书
2014年学校卫生工作总结
2014/11/20 职场文书
教师个人总结范文
2015/02/11 职场文书
结婚典礼致辞
2015/07/28 职场文书
文明礼仪主题班会
2015/08/13 职场文书
小学语文教师研修感悟
2015/11/18 职场文书
pytorch 两个GPU同时训练的解决方案
2021/06/01 Python