如何在创建过程中引用相同的Object属性?

时间:2011-07-26 00:52:58

标签: javascript object

我正在尝试像

那样做
o = {
  a: { foo: 42 },
  b: o.a
}

但是返回错误,表示o未定义。我知道我以后可以做o.b = o.a.但是我想知道在我定义o时是否可以定义b。

5 个答案:

答案 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的评估如下:

     
      
  1. obj 成为创建新对象的结果,就像表达式new Object()一样Object是具有该名称的标准内置构造函数。
  2.   
  3. propId 成为评估 PropertyAssignment 的结果。
  4.   
  5. 使用参数propId.namepropId.descriptorfalse调用 obj 的[[DefineOwnProperty]]内部方法。
  6.   
  7. 返回 obj
  8.   

请注意,在创建 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;