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

fen*_*ent 25 javascript object

我正试着做些喜欢的事情

o = {
  a: { foo: 42 },
  b: o.a
}
Run Code Online (Sandbox Code Playgroud)

但是这会返回一个错误,表示o未定义.我知道我以后可以做ob = oa但是我想知道在我定义o时是否可以定义b.

Mat*_*all 33

正如@RobG评论的那样 - 不,你不能.

但是,您可以使用this定义为对象属性的函数内部的关键字,如下所示:

o = {
  a: { foo: 42 },
  b: function () {
      return this.a;
  }
}

console.log(o.b()); // {foo: 42};
Run Code Online (Sandbox Code Playgroud)


小智 18

现在这只是古老的历史,但我刚刚了解了适合你情况的吸气剂和吸尘剂,我相信看看这个问题的人可以从中获得一些价值.

o = {
  a: { foo: 42 },
  get b() {
    return this.a
    }
  }

console.log(o.b) // => { foo: 42 }
Run Code Online (Sandbox Code Playgroud)

  • 感谢您添加此内容 (2认同)
  • 虽然这在某些情况下可能有效,就像[利用执行上下文的方法](/sf/answers/477691091/),但必须谨慎使用:将此类对象传递给标准可能会得到意想不到的结果方法,例如“Object.values()”或“JSON.stringify()”。 (2认同)

Mik*_*uel 11

这不可能.

在评估属性值时,对象不会绑定到EcmaScript表达式可见的任何范围.

EcmaScript语言规范的第11.1.5节解释了对象构造函数语法的工作原理.

下面描述如何创建对象作为评估第一个属性键值对的副作用

生产PropertyNameAndValueList : PropertyAssignment评估如下:

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

需要注意的是PropertyAssignment被评估后OBJ被创建,但OBJ从未绑定到一个ECMAScript表达式访问的任何名称.

只有在评估了所有属性值之后,才会分配给o程序中的任何符号或任何其他符号.