我正在尝试像
那样做o = {
a: { foo: 42 },
b: o.a
}
但是返回错误,表示o未定义。我知道我以后可以做o.b = o.a.但是我想知道在我定义o时是否可以定义b。
答案 0 :(得分:26)
正如@RobG评论的那样 - 不,你不能。
但是,您可以在定义为对象属性的函数内部使用this
关键字,如下所示:
o = {
a: { foo: 42 },
b: function () {
return this.a;
}
}
console.log(o.b()); // {foo: 42};
答案 1 :(得分:10)
这是不可能的。
在评估属性值时,对象不会绑定到EcmaScript表达式可见的任何范围内。
EcmaScript语言规范的11.1.5部分解释了对象构造函数语法的工作原理。
以下描述了如何创建对象作为评估第一个属性键值对
的副作用生产
PropertyNameAndValueList : PropertyAssignment
的评估如下:
- 让 obj 成为创建新对象的结果,就像表达式
new Object()
一样Object
是具有该名称的标准内置构造函数。- 让 propId 成为评估 PropertyAssignment 的结果。
- 使用参数
propId.name
,propId.descriptor
和false
调用 obj 的[[DefineOwnProperty]]内部方法。- 返回 obj 。
醇>
请注意,在创建 obj 之后会评估 PropertyAssignment ,但 obj 永远不会绑定到EcmaScript表达式可访问的任何名称。
只有在评估完所有属性值后,才能为您分配o
或程序中的任何其他符号。
答案 2 :(得分:10)
现在这只是古老的历史,但我刚刚了解了getters and setters,这对你的情况非常适合,我相信看这个问题的人可以从中获得一些价值。
o = {
a: { foo: 42 },
get b() {
return this.a
}
}
console.log(o.b) // => { foo: 42 }
答案 3 :(得分:0)
另一种方法:
(function() {
var some = { foo: 42 };
window.o = {
a: some,
b: some
};
})();
alert(o.b.foo);
答案 4 :(得分:0)
o = {};
o.a = {foo: 42};
o.b = o.a;