什么';怎么了?通过字符串定义JavaScript名称空间

什么';怎么了?通过字符串定义JavaScript名称空间,javascript,namespaces,Javascript,Namespaces,我使用以下代码定义一个名为com.foo的新名称空间 function extendNamespace(ns, ns_string) { var parts = ns_string.split('.'); var parent = ns; for (var i = 0; i < parts.length; i++) { //create a property if it doesnt exist if (typeof parent[

我使用以下代码定义一个名为com.foo的新名称空间

function extendNamespace(ns, ns_string) {
    var parts = ns_string.split('.');
    var parent = ns;

    for (var i = 0; i < parts.length; i++) {
        //create a property if it doesnt exist
        if (typeof parent[parts[i]] == 'undefined') {
            parent[parts[i]] = {};
        }
        parent = parent[parts[i]];
    }
    return ns;
}

var com = {};
extendNamespace(com, "com.foo");

console.log(com); // OK (even has an object called "foo"!!)
console.log(com.foo); // Undefined ???
函数扩展名称空间(ns,ns\u字符串){
var parts=ns_string.split('.');
var父代=ns;
对于(变量i=0;i
console.log(com)
的第一次调用清楚地向我显示,在控制台中创建了一个新对象“com”,它有一个名为“foo”的对象

到目前为止,一切顺利

第二个调用
console.log(com.foo)虽然返回我“未定义”

有什么好处

对console.log(com)的第一次调用清楚地向我显示,在控制台中创建了一个新对象“com”,它有一个名为“foo”的对象

否。它有一个名为
com
的属性,其值是一个具有名为
foo
属性的对象

当您只想使用
foo
扩展它时,您正在使用
com.foo
扩展
com

对console.log(com)的第一次调用清楚地向我显示,在控制台中创建了一个新对象“com”,它有一个名为“foo”的对象

否。它有一个名为
com
的属性,其值是一个具有名为
foo
属性的对象


当您只想用
foo
扩展它时,您正在用
com.foo
扩展
com

如果仔细观察,您会发现结构是
com.com.foo
。您将
com
传递到函数和字符串
'com.foo'
中,该字符串将嵌套属性
com
com.foo
添加到传入的对象中。@Felix如果您刚刚将此作为答案发布,您将得到40分。3条评论投票+我的投票。如果你仔细看,你会发现结构是
com.com.foo
。您将
com
传递到函数和字符串
'com.foo'
中,该字符串将嵌套属性
com
com.foo
添加到传入的对象中。@Felix如果您刚刚将此作为答案发布,您将得到40分。3张评论票+我的票。你说得对!因此正确的调用应该是
extendNamespace(com,“foo”)你是对的!因此正确的调用应该是
extendNamespace(com,“foo”)