zoukankan      html  css  js  c++  java
  • 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);


  • 相关阅读:
    linux防止sshd被爆破(安装denyhosts)
    记一次网站服务器搬迁实录
    用几条shell命令快速去重10G数据
    如何让你的scrapy爬虫不再被ban之二(利用第三方平台crawlera做scrapy爬虫防屏蔽)
    同时运行多个scrapy爬虫的几种方法(自定义scrapy项目命令)
    如何让你的scrapy爬虫不再被ban
    scrapy爬虫成长日记之将抓取内容写入mysql数据库
    scrapy爬虫成长日记之创建工程-抽取数据-保存为json格式的数据
    python将json格式的数据转换成文本格式的数据或sql文件
    shell脚本去重的几种方法
  • 原文地址:https://www.cnblogs.com/Random/p/1812048.html
Copyright © 2011-2022 走看看