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( 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的方式申明了:

$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);


 

转载于:https://www.cnblogs.com/Random/archive/2010/08/29/1812048.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值