我正在尝试在特定命名空间(dpcom)下添加函数。这可能是点符号,具体取决于用户在其javascript文件中执行的操作。所以基本上,我希望他们做的是这样的事情:
dpcom.library('something.foo.funcName', function() {
// Code goes here.
})
他们可以稍后调用他们的东西:
dpcom.something.foo.funcName();
将执行上面定义的代码。我想要帮助改进它的代码就在这里(它使用的是jQuery):
dpcom.library = function(name, func) {
root = dpcom;
objects = name.split('.');
lastElement = objects[objects.length - 1];
$(objects).each(function(idx, elem) {
if (elem == lastElement) {
root[elem] = func;
} else if (!root[elem]) {
root[elem] = {}
}
root = root[elem];
});
}
这应该处理可能的点表示法并在我的命名空间内创建对象(如果它们尚不存在)(我不想覆盖任何已经声明的对象)。
我上面的代码看起来效果很好,但我有一种感觉,我可以做得更好,但我的大脑并没有告诉我哪里......有人想要刺它吗?
答案 0 :(得分:3)
您应该能够使用shift():
以更具吸引力的方式执行此操作dpcom.library = function(name, func) {
var root = dpcom,
objects = name.split('.'),
elem;
while (elem = objects.shift()) {
if (objects.length) {
if (!root[elem])
root[elem] = {};
root = root[elem];
}
else
root[elem] = func;
}
}
这样,你可以放弃jQuery的要求。另外,不要忘记使用 var 关键字显式声明您的变种。
根据您对性感代码的定义,您也可以替换此块:
if (objects.length) {
if (!root[elem])
root[elem] = {};
root = root[elem];
}
使用:
if (objects.length)
root = !root[elem] ? root[elem] = {} : root[elem];
答案 1 :(得分:3)
这是一种奇怪的代码 - 高尔夫吗?
试试这个,它可能有用......
dpcom.library = function(name, func) {
var p = name.split('.'), e, root = this;
while (e = p.shift()) root = root[e] = root[e] || (!p.length ? func : {});
}
答案 2 :(得分:1)
这是一个刺痛
dpcom.library = function(name, func) {
var lastElement, root = dpcom, objects = name.split(/\./);
lastElement = objects[objects.length - 1];
$.each(objects, function(idx, elem) {
if (!root[elem]) {
if (elem == lastElement) {
root[elem] = func;
} else {
root[elem] = {}
root = root[elem];
}
}
});
}
修改强>
我发现自己使用jQuery的extend方法。查看文档here。
答案 3 :(得分:1)
对阵列使用reduce方法,
dpcom.library = function(key, value) {
var objects = key.split('.');
var leaf = objects.pop();
var constructHierarchy = function(object, property) {
return (object[property] = object[property] || {});
};
objects.reduce(constructHierarchy, dpcom)[leaf] = value;
};
要增加性感因子,请将第二个值设为通用,而不仅仅是一个函数。它已经在所有答案中完成,但明确它有助于:)
dpcom.library('awesome.object', { foo: 'woah' });
答案 4 :(得分:0)
不知道这是否更性感或更具可读性,但它不需要 da Query 并且没有任何全局变量;)
var dpcom = {'test': null, 'something': {}};
dpcom.library = function(name, func) {
for(var i = 0, node = this, names = name.split('.'), l = names.length; i < l; i++) {
node = node[names[i]] = ((i == l - 1) ? func : node[names[i]] || {});
}
};
dpcom.library('something.foo.funcName', function() {
// Code goes here.
});
结果:
{ test: null
, library: [Function]
, something: { foo: { funcName: [Function] } }
}
答案 5 :(得分:0)
查看YUI 2的命名空间功能:
YAHOO.namespace('myNS').funcName = function(){/* do something with arguments */};