需要JavaScript嵌套命名空间生成代码说明

时间:2011-06-13 09:55:06

标签: javascript namespaces design-patterns

任何人都可以解释下面这个有用吗?

var MYAPP = {};
MYAPP.namespace = function(name){
    var parts = name.split('.');
    var current = MYAPP;
    for (var i in parts) {
        if (!current[parts[i]]) {
            current[parts[i]] = {};
        }
        // shouldn't this line override the MYAPP object with all it's properties?
        current = current[parts[i]];
    }
}

4 个答案:

答案 0 :(得分:2)

current首先为MYAPP分配了引用,之后,在循环内,对于来自name.split的数组的每个部分,它随后被分配提及MYAPP的新制造的财产。所以没有任何东西被覆盖,因为它都是引用

例如,如果你执行MYAPP.namespace(foo.bar),就会发生这种情况:

  • 首先:current指向MYAPP
  • 现在进入循环。如果current /*is ref to MYAPP*/ .foo不存在,请创建MYAPP.foo
  • current指向MYAPP.foo
  • 如果current /*is now ref to MYAPP.foo*/ .bar不存在,请创建
  • 最后MYAPP包含:
    • MYAPP.foo
    • MYAPP.foo.bar
  • 如果你想使用对象文字将MYAPP分配给MYAPP.namespace(foo.bar),你会写
    • var MYAPP = { foo: { bar: {} }

答案 1 :(得分:0)

这一切确实是在初始化空对象。

当您致电MYAPP.namespace('foo.bar')时,它会在{}中创建一个空对象(MYAPP.foo),然后再在MYAPP.foo.bar中创建一个空对象。这样,您就可以将函数和变量添加到MYAPP.foo.bar

答案 2 :(得分:0)

namespace方法允许您在MYAPP对象中创建嵌套对象。

如果您致电MYAPP.namespace('foo.bar'),则会:

  • 检查MYAPP.foo是否存在,如果不存在,则创建它。
  • 检查MYAPP.foo.bar是否存在,如果不存在,则创建它。

答案 3 :(得分:0)

我将用代码示例解释它。 查看此代码var MYAPP = {}如果像现在一样离开,则创建一个全局空对象。 MYAPP.namespace是对象的实例方法,可以像MYAPP.namespace("foo.bar")

一样使用

让我们进入快速预览, 当我这样做MYAPP.namespace("ice.cream") 它通过检查像MYAPP.ice.Cream这样单独行动的先前存在来创建两个内部对象 是的,该行确实覆盖了我们的初始MYAPP对象,删除该行或将名称空间方法抽象为全局工具。像Utils.registerNameSpace("MYAPP.Ice.Cream");

这样的东西