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);
    })();
    
  • 相关阅读:
    MTK相关汇总
    Android TV 学习笔记
    进程限制_limit
    Linux TV 学习笔记
    Linux firmware子系统的实现机制学习笔记
    C++ STL deque
    C++ STL Vector
    C++ STL几种数据结构对比
    vector系列--creating vector of local structure、vector of structs initialization
    vector系列--vector<unique_ptr<>>赋值给vector<unique_ptr<>>
  • 原文地址:https://www.cnblogs.com/sofire/p/2036021.html
Copyright © 2011-2022 走看看