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


  • 相关阅读:
    在VMware9.0上安装CentOS6.3+mysql5.5.28数据库 东师理想
    Python学习总结(二)python的练习方法
    gdb调试nasm语法的汇编程序(转载)
    配置Bochs
    量变与质变(生活中,技术上)
    设置gdb反汇编语法为intel(转载)
    Python学习总结(一)
    2012暑假计划
    理解TCP为什么需要进行三次握手(白话)(转载)
    对自己的学习方式的思考(转载)
  • 原文地址:https://www.cnblogs.com/Random/p/1812048.html
Copyright © 2011-2022 走看看