javascript 命名空间以提高代码重用性


Posted in Javascript onNovember 13, 2008

当在同一个网页里引入10多个js文件之后,
各js中的同名函数就很容易冲突了。
比如xxx库里写了个addCssStyle方法,
yyy类库里也写了个addCssStyle方法,
而这两个方法的具体实现又有一定差别。
那么同时引用这两个组件的时候,函数冲突之后导致页面效果发生变化,
调试和修改都是非常痛苦的,如果为了避免冲突,
而放弃引用一些优秀的组件,那更是让人郁闷的事情。

为此,在封装javascript组件库的时候,请使用命名空间来避免冲突。
将所有的方法和变量都要按包名类名的方式来写。
(这个时候写代码的感觉和封装java的util方法一样方便,呵呵)
由此,我的js库按如下方式封装。
google了半天,都没现成的,于是自己摸索出来,示例代码如下:
(lizongbo原创!!!)

<script language="JavaScript" type="text/javascript" >
<!-- //初始化命名空间
var jscom = jscom ? jscom : {};
jscom.lizongbo = jscom.lizongbo ? jscom.lizongbo : {};
//第一种封装方法
jscom.lizongbo.util = jscom.lizongbo.util ? jscom.lizongbo.util : {
crtVersion : 'jscom.lizongbo.util version 0.0.1', //注意用逗号隔开
sayHello: function (str){
window.alert('hello : '+str +' by ' + this.getVersion()); //变量引用要加上this
},//注意用逗号隔开
getVersion :function (){
//alert(' jscom.lizongbo.util version ' + this.crtVersion);//变量引用要加上this
return this.crtVersion+' lizongbo';
}//注意不能够有逗号
}
//第二种封装方法
jscom.lizongbo.util2 =function (){};//重点是这行,它保证了下面的with调用
jscom.lizongbo.util2.crtVersion=' jscom.lizongbo.util2 version 0.0.2';
jscom.lizongbo.util2.sayHello = function(str){
with (jscom.lizongbo.util2) {//这里也是重点,不然会找不到getVersion方法。
window.alert('你好 : '+str +' by ' + getVersion());//这种方法不用加this
}
};
jscom.lizongbo.util2.getVersion = function(){
with (jscom.lizongbo.util2) {//这里也是重点,不然会找不到crtVersion变量。
return crtVersion+' lizongbo2';
}
};
var vutil1= jscom.lizongbo.util; //和java的import差不多好用
vutil1.sayHello('lizongbo'); //第一种调用
var vutil2= jscom.lizongbo.util2;
vutil2.sayHello('lizongbo');//第二种调用
//-->
</script>

把上面的代码复制网页里看看效果吧。
对比两种实现方式,现有代码按第二种方式改造最为方便。
再把js文件按命名空间命名,那样操作就更加方便了。
例如
<script type="text/javascript" src="/commons/scripts/jscom.lizongbo.util1.js"></script>
<script type="text/javascript" src="/commons/scripts/jscom.lizongbo.util2.js"></script>
只要都按此方式编写的库,再也不用担心引入多个js文件之后的函数冲突问题了。

Javascript 相关文章推荐
Jquery中dialog属性小记
Sep 03 Javascript
50款非常棒的 jQuery 插件分享
Mar 29 Javascript
使用jQuery.fn自定义jQuery翻页插件
Jan 20 Javascript
jquery eval解析JSON中的注意点介绍
Aug 23 Javascript
jQuery使用模式窗口实现在主页面和子页面中互相传值的方法
Mar 01 Javascript
基于JavaScript实现快速转换文本语言(繁体中文和简体中文)
Mar 07 Javascript
angularjs ocLazyLoad分步加载js文件实例
Jan 17 Javascript
遍历json获得数据的几种方法小结
Jan 21 Javascript
JQueryEasyUI框架下的combobox的取值和绑定的方法
Jan 22 Javascript
Mongoose实现虚拟字段查询的方法详解
Aug 15 Javascript
Vue自定义过滤器格式化数字三位加一逗号实现代码
Mar 23 Javascript
使用JS判断移动端手机横竖屏状态
Jul 30 Javascript
JavaScript面向对象之体会[总结]
Nov 13 #Javascript
js option删除代码集合
Nov 12 #Javascript
javascript firefox不显示本地预览图片问题的解决方法
Nov 12 #Javascript
javascript显示选择目录对话框的代码
Nov 10 #Javascript
JavaScript XML实现两级级联下拉列表
Nov 10 #Javascript
js wmp操作代码小结(音乐连播功能)
Nov 08 #Javascript
js 目录列举函数
Nov 06 #Javascript
You might like
phpmyadmin MySQL 加密配置方法
2009/07/05 PHP
php设计模式 Composite (组合模式)
2011/06/26 PHP
php中用foreach来操作数组的代码
2011/07/17 PHP
PHP常用正则表达式集锦
2014/08/17 PHP
Linux下安装Memcached服务器和客户端与PHP使用示例
2019/04/15 PHP
Yii2框架操作数据库的方法分析【以mysql为例】
2019/05/27 PHP
使用onbeforeunload属性后的副作用
2007/03/08 Javascript
JS 创建对象(常见的几种方法)
2008/11/03 Javascript
javascript时间函数基础介绍
2013/03/28 Javascript
纯JS实现五子棋游戏兼容各浏览器(附源码)
2013/04/24 Javascript
JavaScript新窗口与子窗口传值详解
2014/02/11 Javascript
吐槽一下我所了解的Node.js
2014/10/08 Javascript
js实现横向百叶窗效果网页切换动画效果的方法
2015/03/02 Javascript
简单介绍jsonp 使用小结
2016/01/27 Javascript
BootStrap实用代码片段之一
2016/03/22 Javascript
JS简单验证上传文件类型的方法
2017/04/17 Javascript
Javascript实现时间倒计时功能
2018/11/17 Javascript
[01:51]DAC趣味视频-如何成为职业选手.mp4
2017/04/02 DOTA
python 实现文件的递归拷贝实现代码
2012/08/02 Python
Django与遗留的数据库整合的方法指南
2015/07/24 Python
python编程线性回归代码示例
2017/12/07 Python
华为2019校招笔试题之处理字符串(python版)
2019/06/25 Python
Python 进程之间共享数据(全局变量)的方法
2019/07/16 Python
python PIL和CV对 图片的读取,显示,裁剪,保存实现方法
2019/08/07 Python
使用CSS3的::selection改变选中文本颜色的方法
2015/09/29 HTML / CSS
Groupon比利时官方网站:特卖和网上购物高达-70%
2019/08/09 全球购物
医药销售求职信范文
2014/02/01 职场文书
环保倡议书300字
2014/05/15 职场文书
先进个人推荐材料
2014/12/29 职场文书
小学运动会开幕词
2015/01/28 职场文书
乱世佳人观后感
2015/06/08 职场文书
实习感想范文
2015/08/10 职场文书
《梅花魂》教学反思
2016/02/18 职场文书
2016年“12.4”法制宣传日活动总结
2016/04/01 职场文书
会议承办单位欢迎词
2019/07/09 职场文书
Redis的字符串是如何实现的
2021/10/24 Redis