【问题标题】:Object referencing its own property on initialization [duplicate]对象在初始化时引用自己的属性[重复]
【发布时间】:2011-11-18 00:05:22
【问题描述】:

可能重复:
Self-references in object literals / initializers

可以这样做吗? (显然不是这种语法)

var a = {
    b : 10,
    c : this.b * 2 // returns 'undefined'
};

我也试过

var a = {
    b : 10,
    c : a.b * 2 // throws error 'a is undefined'
};

var a = {
    b : 10,
    c : b * 2 // throws error 'b is undefined'
};

这些值是未定义的,这对我来说是有意义的,我还没有完成对它们的定义。然而,在我看来,有一种解决方案可以构建这样的对象并让cb 为条件

【问题讨论】:

  • 考虑到您在编译时初始化b,为什么c 会以它为条件?你已经知道它是什么了!
  • 我发布的是一个简化的例子。我不会总是知道b 是什么。否则我不需要有条件的。想想b : function(x) { /* do some stuff */ return y;},
  • @Chad 1. JS 未编译,2. 使用基于另一个表达式的表达式初始化变量是完全正常的,其他语言(例如 C)很好地管理它。
  • @Alnitak 编译是 JS 的错误词......但我的观点是一样的。他正在硬编码一个值(相当于在编译时知道一些东西)。但是,OP 已经澄清说他可能实际上并不知道该值,因此无论如何这一点都没有实际意义。
  • 谢谢@Felix Kling!当我第一次搜索它时,我找不到任何关于此的帖子。我喜欢吸气剂解决方案。 +1

标签: javascript object


【解决方案1】:

或者,您可以使用自启动功能为您提供与您正在寻找的类似的效果:

var a = (function() {
    var b = 10;
    return {
        b:b,
        c:b*2
    }
})();

console.log(a.c);

【讨论】:

  • 我喜欢这样,看起来几乎是 hacky
  • @rlemon:如果你喜欢这样,你为什么不分两部分来避免函数开销呢?事实上,这很混乱。它仍然分两步完成所有事情,最重要的是,您正在调用一个不必要的函数。
【解决方案2】:

不使用对象文字表示法,但您可以使用函数来创建它:

function Structure(value) {
    this.b = value;
    this.c = 2 * value;
}

var a = new Structure(10);

function makeStructure(value) {
    return {b:value, c:2*value};
}

var a = makeStructure(10);

【讨论】:

    猜你喜欢
    • 2013-04-03
    • 2012-02-07
    • 2013-02-24
    • 2012-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-28
    • 1970-01-01
    相关资源
    最近更新 更多