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


  • 相关阅读:
    NeatUpload 同时选择并上传多个文件
    前言
    11:连续出现的字符(1.9)
    06笨小猴(1.9)
    05:最大值和最小值的差(1.9)
    02:输出最高分数的学生姓名(1.9)
    04:谁拿了最多奖学金(1.9)
    03 不高兴的津津(1.9)
    01:查找特定的值(1.9)
    1813(2.1)
  • 原文地址:https://www.cnblogs.com/Random/p/1812048.html
Copyright © 2011-2022 走看看