javascript package的一种简单"优雅"实现
时间:2010-08-29 来源:随机
命名空间(namespace)是一种很常用的管理各种类的方式,javascript的目前版本还没有原生态地实现这个功能,只能去手动模拟一下,代码如下:
var $package=function(ns,clzName,clz){var defineNamespace=function(root,ns){
ns=ns || "";
ns=ns.replace(/\s/g,"");
if (ns.length == 0) {
return root;
}else {
var nsc = ns.substr(0, 1);
if (nsc != nsc.toLowerCase()) {
throw new Error("命名空间首字母必须小写哦~");
}
if (ns.indexOf(".") == -1) {
typeof(root[ns]) != "object" && (root[ns] = {});
return root[ns];
}
else {
var _ns = ns.split(".")[0];
typeof(root[_ns]) != "object" && (root[_ns] = {});
return defineNamespace(root[_ns], ns.replace(/[^\.]*\./, ""));
}
}
},
c=clzName.substr(0,1);
if(c!=c.toUpperCase()){
throw new Error("类名首字母必须大写哦~");
}
defineNamespace(window,ns)[clzName]=clz;
};
现在就可以用package的方式申明了:
this.x= x || 0;
this.y= y || 0;
});
这样就可以用namespace+classname的方式来实例化对象了:
alert(p.constructor===common.app.test.Point);
alert(p.x);
alert(p.y);
不过目前还没有考虑好怎样才能优雅地解决import namespace的问题,要么在使用类的时候,直接用绝对路径,要么就用个中转的变量引用,如:
var Point=common.app.test.Point;var p=new Point(1,2);
alert(p.constructor===common.app.test.Point);
alert(p.x);
alert(p.y);
相关阅读 更多 +