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);
    })();
    
  • 相关阅读:
    IOS之推送通知(本地推送和远程推送)
    IOS,苹果内购和添加广告
    CSS3选择器、背景、边框、文本
    CSS2D旋转、过渡、动画
    JavaScript Array、Date、String
    那些不常用却很有的CSS
    纯CSS打造兼容各种浏览器的几何图形
    安装 SQLManagementStudio_x86_CHS(SQL Server Management Studio) 老提示重启的解决办法
    关于使用Html.RenderPartial和Html.Partial显示分部视图时提示参数错误的BUG
    学习从实践开始之jQuery插件开发:对话框插件开发
  • 原文地址:https://www.cnblogs.com/sofire/p/2036021.html
Copyright © 2011-2022 走看看