手机
当前位置:查字典教程网 >编程开发 >Javascript教程 >在JavaScript中实现命名空间
在JavaScript中实现命名空间
摘要:注:好久没写了,今天把我在公司内网写的文章拷一份,出来露露脸,刚转Web开发,所以开始学javascript!在引入命名空间之前,一个令开发...

注:好久没写了,今天把我在公司内网写的文章拷一份,出来露露脸,刚转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=newObject();

//全局对象仅仅存在register函数,参数为名称空间全路径,如"Grandsoft.GEA"

Namespace.register=function(fullNS)

{

//将命名空间切成N部分,比如Grandsoft、GEA等

varnsArray=fullNS.split('.');

varsEval="";

varsNS="";

for(vari=0;i<nsArray.length;i++)

{

if(i!=0)sNS+=".";

sNS+=nsArray[i];

//依次创建构造命名空间对象(假如不存在的话)的语句

//比如先创建Grandsoft,然后创建Grandsoft.GEA,依次下去

sEval+="if(typeof("+sNS+")=='undefined')"+sNS+"=newObject();"

}

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+"yearsold!");

}

//演示如何使用类Person

varp=newGrandsoft.GEA.Person("yanglf",25);

p.show();哈哈,简单吧,这么简单的代码我就不多说了,大家自己看着玩吧,其实我有点懒,呵呵@_@!!!

【在JavaScript中实现命名空间】相关文章:

在HTML中插入JavaScript代码的示例

JavaScript的9种继承实现方式归纳

浅析JavaScript中的事件机制

Javascript实现飞动广告效果的方法

JavaScript正则表达式中的global属性的使用

JavaScript中继承用法实例分析

JavaScript实现DIV层拖动及动态增加新层的方法

JavaScript中的small()方法使用详解

javascript实现模拟时钟的方法

JavaScript中eval函数的问题

精品推荐
分类导航