由于JS库越来越庞大后,需要引用命名空间的方式,以免各引用js文件中的对象重名,在javascript中不像java,一些面向对象语言有包,命名空间。所以在javascript中需要用代码的方式对对象进行命名空间的注册。方便引用。
以下是整理的一种js命名空间的写法:
//声明Namespace
Namespace = new Object();
//根据传入的名字进行注册,以点号为分隔符,分别对其进行注册
Namespace.register = function(nsName){
//将China.city,折开,对其分别进行注册
var nsArr = nsName.split('.');
var strEval = "";
var strNS = "";
for (var i = 0; i < nsArr.length; i++){
//还原点号,对China进行注册,对China.city进行注册
if (i != 0){
strNS += ".";
}
strNS += nsArr[i];
//将要执行注册的名称,叠加成字符串
strEval += "if(typeof(" + strNS + ") == 'undefined' || !strNS){" + strNS + " = new Object();}"
}
//通过eval统一执行叠加的字符串
if(strEval != ""){
eval(strEval);
}
}
//注册命名空间
Namespace.register("China.city");
Namespace.register("China.railway");
Namespace.register("Province");
//类似java一样,China.city包下面创建info类
China.city.info = function(area, city){
this.area = area;
this.city = city;
}
//类似java一样,China.city包下面创建info类。并在info类下面创建query方法
China.city.info.prototype.query = function(){
alert(this.area + " : " + this.city);
}
var cci = new China.city.info("西南", "成都");
cci.query();
China.railway.info = function(from, to, railway){
this.from = from;
this.to = to;
this.railway = railway;
}
China.railway.info.prototype.query = function(){
alert(this.railway + " : " + this.from + "--" + this.to);
}
var cri = new China.railway.info("北京","上海","京沪铁路");
cri.query();
//类似java一样,由于是split('.'),所以China也被注册了,可以直接在China包下面创建info类
China.info = function(area, name){
this.area = area;
this.name = name;
}
China.info.prototype.query = function(){
alert(this.area + " : " + this.name);
}
var ci = new China.info("亚洲","中国");
ci.query();
//后面又注册了一个Province的包
Province.info = function(area, name){
this.area = area;
this.name = name;
}
Province.info.prototype.query = function(){
alert(this.area + " : " + this.name);
}
var pi = new Province.info("西南","四川省");
pi.query();