您可以这样做:
function getValue(namespace, parent) {
var parts = namespace.split('.'),
current = parent || window;
for (var i = 0; i < parts.length; i += 1) {
if (current[parts[i]]) {
current = current[parts[i]];
} else {
if (i >= parts.length - 1)
return undefined;
}
}
return current;
}
var foo = {
bar: {
baz: true
}
};
console.log(getValue('foo.bar.baz')); //true
函数的第一个参数是命名空间(点分隔值),第二个参数是parent
对象,如果没有提供 parent,则window
使用。
使用 parent 参数的另一个示例:
var str = 'foo.bar.baz';
foo = {
bar: {
baz: true
}
};
result = getValue(str, foo);
console.log(result);
这是jsfiddle中的一个示例。
YUI 中使用了类似的方法。他们的方法被称为命名空间模式。主要好处是模拟包/命名空间。这个脚本和命名空间模式的唯一区别是命名空间函数创建嵌套结构而不是只返回值。