假设我有一个函数,当我只传递一个字符串时,它会动态地为我创建命名空间(我很确定 YUI JS 库的作用):
MyObj.namespace('fn.method.name');
会导致
MyObj.fn.method.name = {}
正在创建 - 所有三个级别都相当于一个空对象。
不过,现在我想做的是最后一个关卡,在这种情况下name
,设置为一个函数,但无需重新声明新创建的对象。
所以不要这样做:
function fnName() { /* some code here */ }
MyObj.namespace('fn.method.name');
MyObj.fn.method.name = new fnName();
我想打电话给这样的人:
MyObj.add('fn.method.name', fnName);
而在内部,add
方法将以编程方式实例化传入的函数:
MyObj.fn.method.name = new fnName()
按照我实现的方式,我可以创建名称空间对象并将其设置为空对象,但是,当我尝试实例化传入函数并将该名称空间与传入函数关联时,它永远不会添加到名称空间。相反,总是返回一个空对象。有任何想法吗?
编辑:这是namespace
方法。它作为 JSON 对象附加到基础对象,因此请忽略格式:
namespace: function (ns) {
var _ns = ns.split('.'),
i = 0, nsLen = _ns.length,
root = this;
if (_ns[0] === gNS) {
_ns.shift();
nsLen = _ns.length;
}
for (i = 0; i < nsLen; i++) {
// create a property if it doesn't exist
var newNs = _ns[i];
if (typeof root[newNs] === "undefined") {
root[newNs] = {};
}
root = root[newNs];
}
return root;
}
edit2 - 删除了传入的fn
争论