在JavaScript中实现命名空间


Posted in Javascript onNovember 23, 2006

注:好久没写了,今天把我在公司内网写的文章拷一份,出来露露脸,刚转Web开发,所以开始学javascript!

在引入命名空间之前,一个令开发人员头疼的问题就是如何防止函数名/类名和其他人的冲突,在一个公司内部项目组之间可以通过命名预定(比如加前缀等)解决这个问题,但是把视线放到整个软件开发领域,在当今协作开发相当盛行的时代,这个问题却依然存在。在使用多个第三方框架或类库的时候,你唯一能作的就是祈祷它们的命名不要冲突,如果真正发生这种灾难的话,你唯一能作的就是放弃其中一个(注:可能是我孤陋寡闻,呵呵)。命名空间的引入相当程度上解决了这个问题,当然,如果你使用的命名空间和其他公司不幸一样,而对方又是微软、SUN等大佬,那恭喜你,呵呵@_@!

从事Web开发不可避免要接触JavaScript,目前最新版本的JavaScript还是不支持命名空间,所以命名冲突的问题凸显无疑,想象一下你引用了两个js文件,却发现由于命名问题导致你不得不放弃其中一个,从而导致多写了许多代码,无疑是十分令人沮丧的。在JavaScript新版本引入命名空间概念之前,发扬自立更生精神和创造性是我们程序员的基本义务;-)

实现前提:与Delphi、C#等语言不同,JavaScript中的类并不是对象的定义,事实上JavaScript中并不存在真正的类,这里的类实际上是用函数模拟实现的,而JavaScript中的函数实际上是一个对象,因此在JavaScript中:一个类就是一个对象。这和传统概念概念极为不同,在JavaScript中,创建某个类的实例实际上就是将类(=对象,记住)复制了一份。看到这里,有点设计模式概念的应该就可以看出来了,在JavaScript中,类机制使用了原型(prototype)模式。

实现原理:既然看清楚了类的本质,那么问题就简单了,如果将GEA项目组所有JS类和函数作为属性放在名为GEA的对象里面,然后将GEA对象以属性的方式放在名为Grandsoft对象里面不就可以达到我们的目的,比如Grandsoft.GEA.Person实际上是在Grandsoft对象的属性GEA(也是一个对象)中的类Person(还是一个对象)。

实现非常简单,整个命名空间机制的实现不超过20行代码,分析如下:

// 声明一个全局对象Namespace,用来注册命名空间

Namespace = new Object();  // 全局对象仅仅存在register函数,参数为名称空间全路径,如"Grandsoft.GEA"  
Namespace.register = function(fullNS)  
{  
    // 将命名空间切成N部分, 比如Grandsoft、GEA等  
    var nsArray = fullNS.split('.');  
    var sEval = "";  
    var sNS = "";  
    for (var i = 0; i < nsArray.length; i++)  
    {  
        if (i != 0) sNS += ".";  
        sNS += nsArray[i];  
        // 依次创建构造命名空间对象(假如不存在的话)的语句  
        // 比如先创建Grandsoft,然后创建Grandsoft.GEA,依次下去  
        sEval += "if (typeof(" + sNS + ") == 'undefined') " + sNS + " = new Object();"  
    }  
    if (sEval != "") eval(sEval);  
}  
上面就是在JavaScript中模拟命名空间机制的完整实现,使用方式如下:  

// 注册命名空间Grandsoft.GEA, Grandsoft.GCM  
Namespace.register("Grandsoft.GEA");  
Namespace.register("Grandsoft.GCM");  
// 在Grandsoft.GEA命名空间里面声明类Person  
Grandsoft.GEA.Person = function(name, age)  
{  
    this.name = name;  
    this.age = age;  
}  
// 给类Person添加一个公共方法show()  
Grandsoft.GEA.Person.prototype.show = function()  
{  
    alert(this.name + " is " + this.age + " years old!");  
}  
// 演示如何使用类Person  
var p = new Grandsoft.GEA.Person("yanglf", 25);  
p.show(); 
哈哈,简单吧,这么简单的代码我就不多说了,大家自己看着玩吧,其实我有点懒,呵呵@_@!!!
Javascript 相关文章推荐
在 IE 中调用 javascript 打开 Excel 表
Dec 21 Javascript
关于jQuery参考实例2.0 用jQuery选择元素
Apr 07 Javascript
JS+CSS实现美化的下拉列表框效果
Aug 11 Javascript
深入解析JavaScript的闭包机制
Oct 20 Javascript
jQuery Easyui学习教程之实现datagrid在没有数据时显示相关提示内容
Jul 09 Javascript
Vue+axios 实现http拦截及路由拦截实例
Apr 25 Javascript
详解用node-images 打造简易图片服务器
May 08 Javascript
jQuery实现 RadioButton做必选校验功能
Jun 15 jQuery
angularjs2 ng2 密码隐藏显示的实例代码
Aug 01 Javascript
JavaScript屏蔽Backspace键的实现代码
Nov 02 Javascript
vue2.0 使用element-ui里的upload组件实现图片预览效果方法
Sep 04 Javascript
vue修改Element的el-table样式的4种方法
Sep 17 Javascript
js变量作用域及可访问性的探讨
Nov 23 #Javascript
bcastr2.0 通用的图片浏览器
Nov 22 #Javascript
一种JavaScript的设计模式
Nov 22 #Javascript
表单内同名元素的控制
Nov 22 #Javascript
document.all与WEB标准
May 13 #Javascript
云网广告中的代码,提示出错,大家找找
Nov 21 #Javascript
在视频前插入广告
Nov 20 #Javascript
You might like
php上传图片并压缩的实现方法
2015/12/22 PHP
微信网页授权(OAuth2.0) PHP 源码简单实现
2016/08/29 PHP
php实现的pdo公共类定义与用法示例
2017/07/19 PHP
Laravel 读取 config 下的数据方法
2019/10/13 PHP
关于js类的定义
2011/06/28 Javascript
JS中处理与当前时间间隔的函数代码
2012/05/23 Javascript
S2SH整合JQuery+Ajax实现登录验证功能实现代码
2013/01/30 Javascript
js 自动播放的实例代码
2013/11/19 Javascript
原始XMLHttpRequest方法详情回顾
2013/11/28 Javascript
js统计录入文本框中字符的个数并加以限制不超过多少
2014/05/23 Javascript
JQuery.dataTables表格插件添加跳转到指定页
2017/06/09 jQuery
手把手教你把nodejs部署到linux上跑出hello world
2017/06/19 NodeJs
node.js部署之启动后台运行forever的方法
2018/05/23 Javascript
JavaScript中判断为整数的多种方式及保留两位小数的方法
2019/09/09 Javascript
在Python操作时间和日期之asctime()方法的使用
2015/05/22 Python
Django的URLconf中使用缺省视图参数的方法
2015/07/18 Python
Python中的默认参数实例分析
2018/01/29 Python
修改python plot折线图的坐标轴刻度方法
2018/12/13 Python
Python实现字符串匹配的KMP算法
2019/04/04 Python
详解Numpy数组转置的三种方法T、transpose、swapaxes
2019/05/27 Python
自定义Django Form中choicefield下拉菜单选取数据库内容实例
2020/03/13 Python
python爬取网易云音乐热歌榜实例代码
2020/08/07 Python
python 实现aes256加密
2020/11/27 Python
Myprotein丹麦官网:欧洲第一运动营养品牌
2019/04/15 全球购物
预订旅游活动、景点和旅游:GetYourGuide
2019/09/29 全球购物
美国在线艺术商店:HandmadePiece
2020/11/06 全球购物
初中生自我鉴定
2014/02/04 职场文书
中华魂放飞梦想演讲稿
2014/08/26 职场文书
从贫穷到富有,是知识技能和学习力的差别
2019/08/20 职场文书
Python 机器学习工具包SKlearn的安装与使用
2021/05/14 Python
在前女友婚礼上,用Python破解了现场的WIFI还把名称改成了
2021/05/28 Python
ORACLE数据库应用开发的三十个注意事项
2021/06/07 Oracle
Python实现DBSCAN聚类算法并样例测试
2021/06/22 Python
HTML基础详解(下)
2021/10/16 HTML / CSS
JavaScript中10个Reduce常用场景技巧
2022/06/21 Javascript
Vue深入理解插槽slot的使用
2022/08/05 Vue.js