【发布时间】:2012-11-12 04:21:00
【问题描述】:
我正在尝试编写一个函数,为对象中的每个嵌套属性添加一个访问器。为了更清楚一点,给定对象 o 和一个表示路径的字符串,我应该能够以命名属性的形式访问该路径上的属性:
var o = {
child1: "foo",
child2: {
child1: "bar",
child2: 1
child3: {
child1: "baz"
}
}
};
addAccessors(o);
o["child2.child1"]; // "bar"
o["child2.child2"]; // 1
o["child2.child3.child1"]; // "baz"
请注意,名称并不总是统一的。
这是我目前所拥有的:
function addAccessors(parent) {
function nestedProps(o, level) {
if (typeof o == "object") {
var level = level || "";
for (p in o) {
if (o.hasOwnProperty(p)) {
if (level && typeof(o[p]) != "object") {
parent[level + "." + p] = o[p];
}
nestedProps(o[p], (level ? level + "." : "") + p);
}
}
}
}
nestedProps(parent);
}
从这一行可以看出:obj[level + "." + p] = o[p];,我只是将值作为新属性添加到数组中。
我希望能够添加一个从适当属性中检索值的访问器,以便它是“活的”。参考我之前的例子:
o["child2.child2"]; // 1
o["child2"]["child2"] = 2;
o["child2.child2"]; // Still 1, but I want it to be updated
关于如何实现这一点的任何想法?
【问题讨论】:
-
为您的对象使用通用的 getter/setter 会更容易,例如
o.get( 'child2.child2' )和o.set( 'child2.child2', 2 ) -
或者,只是一个访问函数,例如
access( o, 'child2.child2' ),因为您似乎可以正常设置值(通过简单的赋值)。 -
这个问题被骗了很多次,但我不想搜索任何一个。
-
@ŠimeVidas 我不知道您可以设置通用吸气剂(我知道的唯一方法是为特定属性定义属性)。可以举个例子吗?
-
您可以使用 ECMAScript Harmony 中的
Proxy,但它并未得到广泛支持。另外请注意,属性名称本身实际上可以包含点,因此默认情况下o["a"]["b"]与o["a.b"]不同。
标签: javascript recursion javascript-objects