實現前提:與Delphi、C#等語言不同,JavaScript中的類並不是對象的定義,事實上JavaScript中並不存在真正的類,這裡的類實際上是用函數類比實現的,而JavaScript中的函數實際上是一個對象,因此在JavaScript中:一個類就是一個對象。這和傳統概念概念極為不同,在JavaScript中,建立某個類的執行個體實際上就是將類(=對象,記住)複製了一份。看到這裡,有點設計模式概念的應該就可以看出來了,在JavaScript中,類機制使用了原型(prototype)模式。
// 聲明一個全域對象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);}
// 註冊命名空間Grandsoft.GEA, Grandsoft.GCMNamespace.register("Grandsoft.GEA");Namespace.register("Grandsoft.GCM");// 在Grandsoft.GEA命名空間裡面聲明類PersonGrandsoft.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!");}// 示範如何使用類Personvar p = new Grandsoft.GEA.Person("yanglf", 25);p.show();