任何人都可以解释下面这个有用吗?
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]];
}
}
答案 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");