Javascript实用程序函数可以安全地创建命名空间

时间:2015-06-01 14:47:34

标签: javascript namespaces

在JS中动态安全地创建名称空间的最佳和最安全的方法是什么?

我需要一个实用程序函数,用于我目前正在处理的小型实用程序库。基本上,我希望它检查我的命名空间的任何部分是否已经存在,并且是一个对象,否则必须初始化此部分并将其作为空对象附加。在这里找到它作为一个jsbin,这样你就可以轻松摆弄它:

  

http://jsbin.com/leyijojozo/1/edit?js,console

var createNamespace = function (className) {
    var parts = className.split(".");

    var context = window;

    for (var i = 0; i < parts.length; i++) {
        if (!context[parts[i]] || !context[parts[i]] instanceof Object) {
            context[parts[i]] = {};
        }
        context = context[parts[i]];
    }
    return context;
}

这适用于以前名称空间不存在的命名空间:

createNamespace("A.B.C");
> {}

返回{}(正如它应该做的那样),如果我之后检查控制台,则命名空间完全存在。

但是,如果命名空间的任何部分已经存在,那么函数当然不应该改变它。只要所有现有部件都是对象,它就可以工作;但是可能存在命名空间的一个或几个部分,但例如是简单的字符串,数组,布尔值等。

编辑:创建此问题和问题的实际用例是我有一个网站正在大量使用。我的应用程序中的典型组件定义如下所示:

Util.Object.createNamespace("ViewModels.Section.Role").Edit = function (params) { ... }

在许多其他实用程序函数(例如驻留在Util.UrlUtil.Cookie等)中,我已经“命名”了我的Util-library,你可以在这里看到,我喜欢这种方法。

我当然知道我可以简单地手动创建命名空间的每个部分,但作为实用功能爱好者(任何人?:))我想要一个简单的功能,它在故障保护中为我做方式。

1 个答案:

答案 0 :(得分:1)

更保守的方法是创建名称空间if (context[parts[i]] === undefined)的一部分。然后没有任何现存可以被覆盖,如果你试图通过像布尔值这样的非对象推送命名空间,你最终会有错误。