我正在尝试构建一个js对象,该属性可以引用同一对象中的另一个属性,这可能吗?这是我的想法,但它不起作用,希望我足够清楚:
var docs = {
a: { properties: [1, 2] },
b: { properties: [3] },
c: { properties: docs.a.properties.concat(docs.b.properties) }
};
document.write(docs.c.properties);
控制台说它找不到docs.a
未捕获的TypeError:无法读取未定义的属性“a”。
答案 0 :(得分:5)
您不能这样做,因为尚未创建对象docs
。您可以执行以下操作:
var docs = {
a: { properties: [1, 2] },
b: { properties: [3] }
}
docs.c = { properties: docs.a.properties.concat(docs.b.properties) };
document.write(docs.c.properties);
或者,您可以这样做:(摘自this answer)
var docs = {
a: { properties: [1, 2] },
b: { properties: [3] },
init: function() {
docs.c = { properties: docs.a.properties.concat(docs.b.properties) };
return this;
}
}.init();
答案 1 :(得分:2)
假设您希望c
始终镜像a
和b
,而不仅仅是在开始时,您可以使用getter
来定义它功能:
var docs = {
a: { properties: [1, 2] },
b: { properties: [3] },
get c() {
return { properties: docs.a.properties.concat(docs.b.properties) };
}
};
console.log(docs.c.properties.join(", ")); // "1, 2, 3"
var docs = {
a: { properties: [1, 2] },
b: { properties: [3] },
get c() { return { properties: docs.a.properties.concat(docs.b.properties) }; }
};
snippet.log("a: " + JSON.stringify(docs.a));
snippet.log("b: " + JSON.stringify(docs.b));
snippet.log("c: " + JSON.stringify(docs.c));

<!-- Script provides the `snippet` object, see http://meta.stackexchange.com/a/242144/134069 -->
<script src="//tjcrowder.github.io/simple-snippets-console/snippet.js"></script>
&#13;
请注意,对c
的每次访问都会创建一个新对象和一个新的连接数组,因此效率不高。但如果你想要它是动态的......
或者因为它只是c.properties
你真的需要一个吸气剂:
var docs = {
a: { properties: [1, 2] },
b: { properties: [3] },
c: { get properties() {
return docs.a.properties.concat(docs.b.properties);
}
}
};
console.log(docs.c.properties.join(", ")); // "1, 2, 3"
var docs = {
a: { properties: [1, 2] },
b: { properties: [3] },
c: { get properties() {
return docs.a.properties.concat(docs.b.properties);
}
}
};
snippet.log("a: " + JSON.stringify(docs.a));
snippet.log("b: " + JSON.stringify(docs.b));
snippet.log("c: " + JSON.stringify(docs.c));
&#13;
<!-- Script provides the `snippet` object, see http://meta.stackexchange.com/a/242144/134069 -->
<script src="//tjcrowder.github.io/simple-snippets-console/snippet.js"></script>
&#13;
在那里,每次都会重新创建c.properties
,而不是c
本身。