螺 丝 钉 阅读(198) 评论(0)

不论是哪种语言,或者框架,都有命名空间Namespace影子。例如C、C++、Java、C#、XML、Struts2、MyBatis等等。NameSpace的作用就是区分同名不同作用的

Class、Object、Var等等,也就是解决重名给程序带来的麻烦。

昨天看了一篇日志:

 1 Namespace = new Object();
 2 // 全局对象仅仅存在register函数,参数为名称空间全路径,如"Grandsoft.GEA"
 3 Namespace.register = function(fullNS)
 4 {
 5     // 将命名空间切成N部分, 比如Grandsoft、GEA等
 6     var nsArray = fullNS.split('.');
 7     var sEval = "";
 8     var sNS = "";
 9     for (var i = 0; i < nsArray.length; i++)
10     {
11         if (i != 0) sNS += ".";
12         sNS += nsArray[i];
13         // 依次创建构造命名空间对象(假如不存在的话)的语句
14         // 比如先创建Grandsoft,然后创建Grandsoft.GEA,依次下去
15         sEval += "if (typeof(" + sNS + ") == 'undefined') " + sNS + " = new Object();"
16     }
17     if (sEval != "") eval(sEval);
18 }
View Code

 

作者是这样来创建命名空间的。

我对程序进行了改装:

 1 var fjnNameSpaceUtil=(function(){
 2     // com.fjn.js.util.Hello
 3     var _regist=function(fullName){
 4         if(typeof fullName =='string')
 5         {
 6         //    console.log(fullName);
 7             var arr=fullName.split(".");
 8             
 9             var obj=undefined;
10         
11             for(var i=0; i<arr.length; i++ )
12             {
13                 if(arr[i] && typeof arr[i]=='string')
14                 {
15                     if(i==0)
16                     {
17                         try{
18                             var str=arr[0]+"==undefined";
19                 //            console.log(str);
20                             eval("("+str+")");
21                         }
22                         catch(error)
23                         {
24                             // 创建一个对象,名字和arr[i]一样
25                             str="obj="+arr[i]+"={}";
26                     //        console.log(str);
27                             eval("("+str+")");
28                         }
29                     }
30                     else if(obj)
31                     {
32                         obj[arr[i]]={};
33                         obj=obj[arr[i]];
34                     }
35                 }
36             }
37         }
38         else
39         {
40             throw new Error("param '"+fullName+"' not a string !"); 
41         }
42     }
43     return {regist:_regist}
44 })();
View Code

将改装后的代码放在一个NameSpaceUtil.js文件中。就可以随意的引入到其他的程序中了。