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


  • 相关阅读:
    cshtml 中的 AppState = Context.Application 和 控制器中的 Application 也相等
    HangFire快速入门 分布式后端作业调度框架服务
    用RSA加密实现Web登录密码加密传输
    c# MD5及盐值加密
    CentOS目录结构超详细版
    两篇文章带你走入.NET Core 世界:CentOS+Kestrel+Ngnix 虚拟机先走一遍(一)
    利用js实现 禁用浏览器后退
    在.Net Core WebAPI下给Swagger增加导出离线文档功能
    mysql 数据库扫描行数
    EFCore+Mysql仓储层建设(分页、多字段排序、部分字段更新)
  • 原文地址:https://www.cnblogs.com/Random/p/1812048.html
Copyright © 2011-2022 走看看