我需要一个实用程序函数,用于我目前正在处理的小型实用程序库。基本上,我希望它检查我的命名空间的任何部分是否已经存在,并且是一个对象,否则必须初始化此部分并将其作为空对象附加。在这里找到它作为一个jsbin,这样你就可以轻松摆弄它:
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");
> {}
返回{}
(正如它应该做的那样),如果我之后检查控制台,则命名空间完全存在。
但是,如果命名空间的任何部分已经存在,那么函数当然不应该改变它。只要所有现有部件都是对象,它就可以工作;但是可能存在命名空间的一个或几个部分,但例如是简单的字符串,数组,布尔值等。
编辑:创建此问题和问题的实际用例是我有一个网站正在大量使用knockout.js和knockout-components。我的应用程序中的典型组件定义如下所示:
Util.Object.createNamespace("ViewModels.Section.Role").Edit = function (params) { ... }
在许多其他实用程序函数(例如驻留在Util.Url
,Util.Cookie
等)中,我已经“命名”了我的Util-library,你可以在这里看到,我喜欢这种方法。
我当然知道我可以简单地手动创建命名空间的每个部分,但作为实用功能爱好者(underscore任何人?:))我想要一个简单的功能,它在故障保护中为我做方式。
答案 0 :(得分:1)
更保守的方法是创建名称空间if (context[parts[i]] === undefined)
的一部分。然后没有任何现存可以被覆盖,如果你试图通过像布尔值这样的非对象推送命名空间,你最终会有错误。