为了账号安全,请及时绑定邮箱和手机立即绑定

对象文字/初始化器中的自引用

对象文字/初始化器中的自引用

噜噜哒 2019-05-21 15:32:10
有没有办法在JavaScript中使用以下内容?var foo = {    a: 5,    b: 6,    c: this.a + this.b  // Doesn't work};在当前形式中,此代码显然会抛出引用错误,因为this没有引用foo。但是,是有什么办法对早些时候宣布的其他属性在对象文本的属性值依赖?对象文字/初始化器中的自引用
查看完整描述

4 回答

?
汪汪一只猫

TA贡献1898条经验 获得超8个赞

好吧,我唯一可以告诉你的是吸气剂:


var foo = {

  a: 5,

  b: 6,

  get c () {

    return this.a + this.b;

  }

};


foo.c; // 11

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


查看完整回答
反对 回复 2019-05-21
?
梦里花落0921

TA贡献1772条经验 获得超5个赞

你可以这样做:


var foo = {

   a: 5,

   b: 6,

   init: function() {

       this.c = this.a + this.b;

       return this;

   }

}.init();

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


请注意,你实际上是分配的返回值init()来foo,所以你必须return this


查看完整回答
反对 回复 2019-05-21
?
海绵宝宝撒

TA贡献1809条经验 获得超8个赞

缺少明显的简单答案,所以为了完整性:


但是,是有什么办法对早些时候宣布的其他属性在对象文本的属性值依赖?


不会。这里的所有解决方案都会推迟到创建对象之后(以各种方式),然后分配第三个属性。在最简单的方法是只是这样做:


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);


查看完整回答
反对 回复 2019-05-21
?
慕神8447489

TA贡献1780条经验 获得超1个赞

只需实例化一个匿名函数:


var foo = new function () {

    this.a = 5;

    this.b = 6;

    this.c = this.a + this.b;

};


查看完整回答
反对 回复 2019-05-21
  • 4 回答
  • 0 关注
  • 622 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信