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