当命名空间已存在时,Type.registerNamespace会抛出错误

时间:2013-05-20 15:13:22

标签: javascript namespaces microsoft-ajax

在我的公司环境中,我们使用了大量的JavaScript。为了简化所有这些脚本的管理,并避免命名冲突,我们采用了命名空间的javascript命名约定,基本上是:

  

CompanyName.ProjectName.Area.XYZ.js

要创建名称空间,我们使用以下模式:

var Company;
(function (Company) {
    (function (Project) {
        (function (Area) {
            (function (XYZ) {

                function function1(args) {

                },
                function function2(args) {

                }
            })(Area.XYZ|| (Area.XYZ = {}));

        })(Project.Area || (Project.Area = {}));
        var Area = Project.Area;
    })(Company.Project || (Company.Project = {}));
    var Project = Company.Project;
})(Company || (Company = {}));

哪种方法正常(实际上,这是TypeScript脚本的输出)。

但是,我也有一些使用Microsoft Ajax命名空间函数的脚本,因为这是失控应用程序(javascript插件)所必需的。

我使用这个声明:

Type.registerNamespace('CompanyName.ProjectName.Area');
CompanyName.ProjectName.Area.ABC = function() {
}
CompanyName.ProjectName.Area.ABC.prototype = {
    function1 : function (args) {

    },
    function2 : function (args) {

    }
}

但是对Type.registerNamespace的调用会引发错误:

  

Sys.InvalidOperationException:对象公司已存在且不是命名空间

我如何正确地结合这两个世界?如何解决我的问题并使警告消失?

  • 我无法控制脚本包含的顺序,因为它是由应用程序动态生成的。

  • 我不想将整个代码迁移到Microsoft的模式,因为它非常无用且难以阅读。当我迁移到打字稿时,我甚至无法控制命名空间输出。

  • 我也不想引入替代名称空间来排除Ajax的名称空间,因为它会给所有团队带来一些混乱。

2 个答案:

答案 0 :(得分:1)

几个月后......我最终不得不创建两个独立的命名空间。一个用于MS Ajax刚性模型,一个用于自创名称空间。

CompanyName.ProjectName.Area
CompanyNameAjax.ProjectName.Area

答案 1 :(得分:0)

你能不能尝试/抓住它?

try {
  Type.registerNamespace('CompanyName.ProjectName.Area');
} catch( e ) {
   //log it, or just ignore it..
}