对象字面声明中的引用

有没有什么办法让下面的东西在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;
  }
};

foo.c; // 11

这是ECMAScript第5版规范引入的语法扩展,大多数现代浏览器(包括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's特别聪明,但需要创建和销毁临时函数,增加复杂性;并且在对象上留下额外的属性,或者[如果您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);
链接地址: http://www.djcxy.com/p/94919.html

上一篇: references in object literal declarations

下一篇: execution context and (( this object ))