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)