zoukankan      html  css  js  c++  java
  • 在JavaScript中实现命名空间。

    (function ()
    {
        var namespaceArray = [];
        function namespaceObject(name, fullName)
        {
            this.fullName = fullName;
            this.name = name;
        };
        var namespaceManager =
        {
            namespaces: namespaceArray
            , global: this
        };
        function using(namespace, action)
        {
            if (!namespace) throw new Error('namespace 不允许为空。');
            else if (typeof (namespace) != "string") throw new Error('namespace 只能为字符串形式。');
            else if (namespace.charAt(0) == '.' || namespace.charAt(namespace.length - 1) == '.' || namespace.indexOf("..") != -1)
            {
                throw new Error("非法的命名空间:" + namespace + "。 ");
            }
    
            var parentNS = namespaceArray[namespace];
            if (!parentNS)
            {
                var nss = namespace.split('.'); //- 拆分 namespace
                var parentNS = namespaceManager.global; //- 假定上级为全局命名空间
                var fullName;
                for (var i = 0; i < nss.length; i++)
                {
                    var ns = nss[i];
    
                    if (!fullName) fullName = ns;
                    else fullName = fullName + "." + ns;
    
                    var nsObject = parentNS[ns];
    
                    if (!nsObject)
                    {
                        nsObject = new namespaceObject(name, fullName);
                        parentNS[ns] = nsObject;
                    }
                    else if (typeof nsObject != "object") throw new Error(nss.slice(0, i).join('.') + " 非 object 类型的命名空间。");
                    else nsObject = parentNS[ns];
    
                    parentNS = nsObject;
                }
                namespaceArray[namespace] = parentNS;
            }
            if (typeof action == "function")
            {
                action.call(parentNS);
            }
            if (parentNS !== namespaceManager.global)
            {
                for (var i in parentNS)
                {
                    if (!namespaceManager.global[i])
                        namespaceManager.global[i] = parentNS[i];
                }
            }
            return parentNS;
        };
        function clearUsing(namespace)
        {
            var parentNS = namespaceArray[namespace];
            if (parentNS)
            {
                for (var i in parentNS)
                {
                    if (i == "name" || i == "fullName" || typeof parentNS[i] == "namespaceObject") continue;
                    if (namespaceManager.global[i])
                    {
                        delete namespaceManager.global[i];
                    }
                }
            }
        }
    
        window.using = using;
        window.clearUsing = clearUsing;
        window.namespaceManager = namespaceManager;
    
        using("Sofire.Test", function ()
        {
            this.HelloClass = function ()
            {
                this.Name = "hello";
            };
        });
    
        alert(HelloClass);
        clearUsing("Sofire.Test");
    
        if (typeof HelloClass != "undefined")
        {
            alert("Exits");
        }
        else alert("Not Exits");
        using("Sofire.Test", function ()
        {
            this.HelloClass2 = function ()
            {
                this.Name2 = "hello2";
            }
        });
        alert(HelloClass);
        alert(HelloClass2);
    })();
    
  • 相关阅读:
    164 Maximum Gap 最大间距
    162 Find Peak Element 寻找峰值
    160 Intersection of Two Linked Lists 相交链表
    155 Min Stack 最小栈
    154 Find Minimum in Rotated Sorted Array II
    153 Find Minimum in Rotated Sorted Array 旋转数组的最小值
    152 Maximum Product Subarray 乘积最大子序列
    151 Reverse Words in a String 翻转字符串里的单词
    bzoj3994: [SDOI2015]约数个数和
    bzoj 4590: [Shoi2015]自动刷题机
  • 原文地址:https://www.cnblogs.com/sofire/p/2036021.html
Copyright © 2011-2022 走看看