【问题标题】:Can I reference other properties during object declaration in JavaScript? [duplicate]我可以在 JavaScript 中的对象声明期间引用其他属性吗? [复制]
【发布时间】:2011-06-04 20:22:47
【问题描述】:

我正在尝试做这样的事情:

var obj = {
    a: 5,
    b: this.a + 1
}

(而不是 5 有一个我不想执行两次的函数返回一个数字)

我可以稍后从obj.a 重写它以分配obj.b,但我可以在声明期间立即执行吗?

【问题讨论】:

标签: javascript


【解决方案1】:

这应该返回正确的值:

function () {
   var aVar = 5;
   var bVar = aVar + 1;

return {
    a : aVar,
    b : bVar;  
}
}();

【讨论】:

    【解决方案2】:

    不,在您的示例中,this 的值不引用对象文字。

    您需要在创建对象后为b 分配一个值,以便它基于obj 中的另一个属性。

    【讨论】:

      【解决方案3】:

      没有。 this 的含义与定义之外的含义相同。

      【讨论】:

        【解决方案4】:

        在 chrome 调试器中

        > var o = {a: 5, b: this.a+1}
        undefined
        > o.b
        NaN
        > o.a
        5
        

        【讨论】:

          【解决方案5】:

          有几种方法可以做到这一点;这就是我要使用的:

          function Obj() {
              this.a = 5;
              this.b = this.a + 1;
              // return this; // commented out because this happens automatically
          }
          
          var o = new Obj();
          o.b; // === 6
          

          【讨论】:

            【解决方案6】:

            没有。 JavaScript 中的this 不像你想象的那样工作。 this 在这种情况下指的是全局对象。

            只有 3 种情况会设置值 this

            函数案例

            foo();
            

            这里this 将引用全局 对象。

            方法案例

            test.foo(); 
            

            在此示例中,this 将引用 test

            构造函数案例

            new foo(); 
            

            前面带有new 关键字的函数调用充当构造函数。在函数this 内部将引用一个新的 创建Object

            在其他任何地方,this 指的是全局对象。

            【讨论】:

            • +1 不错的答案。只有当this 通过.call().apply() 使用函数或方法案例显式设置时,我才会添加案例。 (也许更多的是这两种情况的一个子集。)
            • 是的,可以添加这些,但它们在 IMO 中有点超出范围,尽管我会将它们添加到我的文档中。
            • 我同意。我认为您的回答涵盖了该问题的必要基础。
            • @user113716 别忘了.bind(...)
            • this in "The Function Case" 指的是父对象,而不是全局对象:const obj = { a: 5, b: function foo() { return this.a + 1; } };
            【解决方案7】:

            事实证明,除非第一个对象是函数,否则您不能在另一个对象中引用一个对象。但是你可以这样做。

                var obj = {
                    a: 5
                }
            
                obj.b = obj.a + 1; // create field b in runtime and assign it's value
            

            如果您使用 console.log(obj),您将拥有

               obj = {
                    a: 5,
                    b: 6
                 } 
            

            这样你就可以为代码的剩余部分保留对象字面量结构

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2014-10-24
              • 1970-01-01
              • 2011-03-11
              • 2020-11-20
              • 2017-04-11
              • 2011-08-28
              • 2015-01-06
              • 2015-12-15
              相关资源
              最近更新 更多