javascript package的一种简单"优雅"实现

命名空间(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(01);
                
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的方式申明了:

$package("common.app.test","Point",function(x,y){
    
this.x= x || 0;
    
this.y= y || 0;
});


这样就可以用namespace+classname的方式来实例化对象了:

    var p=new common.app.test.Point(1,2);
    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);


 

posted @ 2010-08-29 20:38  随机  阅读(2007)  评论(0编辑  收藏  举报