协慌网

登录 贡献 社区

对象常量 / 初始值设定项中的自引用

有什么办法可以使以下内容在 JavaScript 中起作用?

var foo = {
    a: 5,
    b: 6,
    c: this.a + this.b  // Doesn't work
};

在当前形式中,该代码明显抛出一个参考错误,因为this不是指foo 。但是,是否有任何方法可以使对象文字的属性中的值取决于之前声明的其他属性?

答案

好吧,我唯一能告诉你的就是吸气剂

var foo = {
  a: 5,
  b: 6,
  get c() {
    return this.a + this.b;
  }
}

console.log(foo.c) // 11

这是 ECMAScript 5th Edition 规范引入的语法扩展,大多数现代浏览器(包括 IE9)都支持该语法。

您可以执行以下操作:

var foo = {
   a: 5,
   b: 6,
   init: function() {
       this.c = this.a + this.b;
       return this;
   }
}.init();

这将是对象的某种一次性初始化。

请注意,您实际上是将init()的返回值分配给foo ,因此必须return this

缺少显而易见的简单答案,因此出于完整性考虑:

但是,是否有任何方法可以使对象文字的属性中的值取决于之前声明的其他属性?

否。这里的所有解决方案都将其推迟到创建对象(以各种方式)然后分配第三个属性之后。最简单的方法是执行以下操作:

var foo = {
    a: 5,
    b: 6
};
foo.c = foo.a + foo.b;

所有其他方法只是做同一件事的更间接的方法。 (Felix 的技巧特别聪明,但是需要创建和销毁临时函数,从而增加了复杂性;并且要么在对象上留下额外的属性,要么 [如果delete该属性] 会影响对该对象的后续属性访问的性能。)

如果需要全部都包含在一个表达式中,则可以在没有临时属性的情况下执行此操作:

var foo = function(o) {
    o.c = o.a + o.b;
    return o;
}({a: 5, b: 6});

或者,当然,如果您需要多次执行此操作:

function buildFoo(a, b) {
    var o = {a: a, b: b};
    o.c = o.a + o.b;
    return o;
}

然后在需要使用它的地方:

var foo = buildFoo(5, 6);