首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在ES6中的Object.keys中访问此内容

在ES6中的Object.keys中访问此内容
EN

Stack Overflow用户
提问于 2019-03-18 01:37:16
回答 4查看 2K关注 0票数 3

假设我有以下代码:

代码语言:javascript
复制
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,如果它对你有帮助的话。谢谢!

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2019-03-18 01:43:04

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

代码语言:javascript
复制
Object.keys(this.obj).forEach((name, index) =>
{
    alert(this.obj[name])
});

请参阅MDN

票数 6
EN

Stack Overflow用户

发布于 2019-03-18 01:44:08

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

OLD WAY:在这个解决方案中,我们在变量self中保留了对当前上下文的引用

代码语言:javascript
复制
class Test {
  constructor(obj){
    this.obj = obj
  }

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

}

objct = {
  n1: 1,
  n2: 2
}

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

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

代码语言:javascript
复制
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()

票数 5
EN

Stack Overflow用户

发布于 2019-03-18 01:48:55

Javascript中的经典作用域课程。

有两种方法可以完成此操作:

使用bind()将forEach的作用域绑定到父函数

代码语言:javascript
复制
change() {
  Object.keys(this.obj).forEach(function(name, index) {
    alert(this.obj[name])
  }.bind(this))
  }

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

代码语言:javascript
复制
change() {
  Object.keys(this.obj).forEach((name, index) => {
    alert(this.obj[name])
  })
  }
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55209965

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档