【问题标题】:JavaScript nested namespace generation code explanation needed需要 JavaScript 嵌套命名空间生成代码说明
【发布时间】:2011-09-13 19:25:36
【问题描述】:

谁能解释下面的工作原理?

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]];
    }
}

【问题讨论】:

  • 该行覆盖 指针 current 指向MYAPP。它不会覆盖 MYAPP

标签: javascript namespaces design-patterns


【解决方案1】:

current 首先被分配一个 referenceMYAPP,然后,在循环中,对于来自 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.namespace(foo.bar) 相同的值分配给MYAPP,您可以编写
    • var MYAPP = { foo: { bar: {} }

【讨论】:

  • 谢谢,问题是从“MYAPP.foo 到 MYAPP.foo.bar”的重新分配让我很困惑,很好的解释,再次感谢
【解决方案2】:

所有这些实际上都是初始化空对象。

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

【讨论】:

    【解决方案3】:

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

    如果你打电话给MYAPP.namespace('foo.bar'),它会:

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

    【讨论】:

      【解决方案4】:

      我将通过代码示例进行解释。 请参阅此代码 var MYAPP = {} 如果像现在这样离开,则会创建一个全局空对象。 MYAPP.namespace是对象的实例方法,可以像MYAPP.namespace("foo.bar")一样使用

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-12-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-05-20
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多