在ES6中的Object.keys内部访问它

时间:2019-03-17 17:37:16

标签: javascript ecmascript-6

假设我有以下代码:

class Test {
  constructor(obj) {
    this.obj = obj
  }

  change() {
    Object.keys(this.obj).forEach(function(name, index) {
      alert(this.obj[name])
    })
  }

}

objct = {
  n1: 1,
  n2: 2
}

var test = new Test(objct)
test.change()

但是,当我运行它时,出现以下错误:

  

未捕获的TypeError:无法读取未定义的属性'obj'

我相信这意味着this在对象键函数中未定义。如何在对象键和forloop中访问this.obj

根据此answer,我可以使用map,但是我需要在forloop中使用属性名和数组index。如果可以帮助您,请看这里的fiddle代码。谢谢!!!

4 个答案:

答案 0 :(得分:6)

这是因为您要传递给this的函数的函数上下文(forEach())现在为window,而不再是您的Test实例。 / p>

如果改为使用箭头功能,则可以保留 lexical-scope ,并且您的this指向当前(Test)实例:

Object.keys(this.obj).forEach((name, index) =>
{
    alert(this.obj[name])
});

请参见MDN

答案 1 :(得分:4)

HomeFragment引用了函数的当前上下文,因此在您的示例中,HomeFragmentMainFragment回调的上下文中查找this。您可以通过保留对当前上下文的引用来解决此问题,即this.obj或改用箭头功能。

老方法:在此解决方案中,我们在变量obj

中保留对当前上下文的引用

forEach

首选或速记解决方案:通过使用箭头功能

this

答案 2 :(得分:4)

经典的Java范围课程。

有两种方法可以做到这一点:

使用bind()将forEach的范围绑定到父函数

change() {
  Object.keys(this.obj).forEach(function(name, index) {
    alert(this.obj[name])
  }.bind(this))
  }

使用=>,这是将forEach范围绑定到父函数的另一种方式

change() {
  Object.keys(this.obj).forEach((name, index) => {
    alert(this.obj[name])
  })
  }

答案 3 :(得分:1)

匿名函数未绑定到上下文,因此它们无权访问this;但是箭头功能是。因此,请改用它。

class Test {
  constructor(obj) {
    this.obj = obj
  }

  change() {
    Object.keys(this.obj).forEach((name, index) => {
      alert(this.obj[name])
    })
  }

}

objct = {
  n1: 1,
  n2: 2
}

var test = new Test(objct)
test.change()