我可以在 JavaScript 中的对象声明期间引用其他属性吗?

IT技术 javascript
2021-01-12 10:51:58

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

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

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

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

6个回答

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

只有 3 种情况下this会设置该值

功能案例

foo();

这里this将引用全局对象。

方法案例

test.foo(); 

在这个例子this中将参考test.

构造函数案例

new foo(); 

new关键字开头的函数调用充当构造函数。在函数内部this将引用一个新创建的Object.

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

是的,可以添加这些,但它们有点超出了 IMO 的范围,尽管我会将它们添加到我的文档中。
2021-03-14 10:51:58
我同意。我认为您的回答涵盖了该问题的必要基础。
2021-03-20 10:51:58
@user113716 不要忘记 .bind(...)
2021-03-20 10:51:58
this 在“函数案例”中是指父对象,而不是全局对象: const obj = { a: 5, b: function foo() { return this.a + 1; } };
2021-03-28 10:51:58
+1 不错的答案。只有this通过.call()or使用函数或方法 case 显式设置时,我才会添加 case .apply()(也许更多的是这两种情况的一个子集。)
2021-04-08 10:51:58

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

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

这应该返回正确的值:

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

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

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

    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
     } 

通过这种方式,您可以为代码的其余部分保留对象字面量结构

不,在您的示例中,的值this不是指对象文字。

您需要b在创建对象后为其分配一个值,以便基于obj.