在JavaScript中使用相同对象内部的键值对与'this'[重复]

gwo2fgha  于 2023-09-29  发布在  Java
关注(0)|答案(3)|浏览(81)

此问题已在此处有答案

Self-references in object literals / initializers(32个回答)
2天前关闭。
假设我有两个对象

var a = {
    b: 1,
    c: this.b
};

var funcObj = {
    b : function() {
        return 1;
    },
    c: function() {
       console.log(return this.b())
    }
}

在记录这两个像

console.log(a.c)//results undefined
console.log(funcObj.c()) //results 1

为什么第一个函数不能使用this属性,而第二个可以?我真的很困惑。

hujrc8aj

hujrc8aj1#

答案取决于this在每个上下文中指的是什么。在JavaScript中,this被绑定到当前函数被调用时点(.)左边的任何对象。如果我们不在函数中,事情会变得有点模糊--this要么是全局window对象,要么是undefined,这取决于环境。
在第一个示例中,this的值取决于周围的上下文。当JavaScript构建对象a时,它会计算this.b。无论this当前绑定到什么对象,都没有b属性,因此c属性被设置为undefined
在第二个示例中,当调用funcObj.c()时,函数中的this被绑定到funcObj。因此,当您请求b属性时,您将获得上面定义的bfuncObj.b是一个函数的事实实际上是无关紧要的。以下方法同样有效:

var funcObj = {
    b :  1,
    c: function() {
       return this.b
    }
}
aydmsdu9

aydmsdu92#

您不能在声明中引用其他属性作为JavaScript文本声明的一部分。所以,在你的JavaScript文本声明中:

var a = {
    b: 1,
    c: this.b
};

this没有被设置为你想要的,a还没有被初始化,所以你也不能引用它。在字面量声明时根本没有办法到达其他属性。这是当前JavaScript规范的一个限制。你可以这样做:

var a = {
    b: 1
};
a.c = a.b;

因为a在那一点上完全形成了,所以你可以引用其中的其他属性。
或者,在现代浏览器中,您甚至可以使用getter来获取b的“live”版本(这与您要求的功能不完全相同,因为它是b的“live”版本,将跟踪它的值),但向您展示了另一种可能性:

var a = {
    b: 1,
    get c() {
         return b;
    }
};

console.log(a.c); //results 1

在第二个例子中:

var funcObj = {
    b : function() {
        return 1;
    },
    c: function() {
       console.log(return this.b())
    }
}

console.log(funcObj.c()) //results 1

您正在调用funcObj.c(),这将把c内部的this的值设置为funcObj,因此您可以通过this引用其他属性。
这里的主要区别是this没有被设置为JavaScript字面量定义中的对象(第一个例子),但是当你像funcObj.c()那样调用一个方法时,this被设置为对象。

sz81bmfz

sz81bmfz3#

我知道这篇文章有点旧,但我在试图解决类似问题时遇到了它。
我想做的是:

const x = {
  a: 12,
  b: a + 1
}
console.log(x) //results undefined

(That与我实际在做的相比,这是非常简化的,但原理是一样的。)
我的解决方案是首先创建一个函数,它将构建我想要的对象,然后传入我试图操作的主值(在这个例子中,是'a'中的值):

function buildObj (val) {
  const response = {
    a: val,
    b: val + 1
  };
  return response;
}

然后:

const x = buildObj(12)

console.log(x) // results { a: 12, b: 13 }

一旦x被初始化,任何后续访问

x.a

的尝试

x.b

将返回存储在其中的值。
如果将来的开发人员遇到这个问题,因为他们想要对存储在同一对象内的嵌套键中的值进行操作,希望这会有所帮助。

相关问题