在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);
})();
posted @ 2011-05-04 00:04  Treenew Lyn  阅读(502)  评论(4编辑  收藏  举报