JS--命名空间的理解(namespace)

引入命名空间以前,一个令开发人员头疼的问题就是如何防止函数名/类名和其余人的冲突,在一个公司内部项目组之间能够经过命名预约(好比加前缀等)解决这个问题,可是把视线放到整个软件开发领域,在当今协做开发至关盛行的时代,这个问题却依然存在。在使用多个第三方框架或类库的时候,你惟一能做的就是祈祷它们的命名不要冲突,若是真正发生这种灾难的话,你惟一能做的就是放弃其中一个(注:多是我孤陋寡闻,呵呵)。命名空间的引入至关程度上解决了这个问题,固然,若是你使用的命名空间和其余公司不幸同样,而对方又是微软、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

转自:博文来源html