Javascript 在ES6中访问此内部Object.keys

Javascript 在ES6中访问此内部Object.keys,javascript,ecmascript-6,Javascript,Ecmascript 6,假设我有以下代码: 类测试{ 建造师(obj){ this.obj=obj } 更改(){ Object.keys(this.obj).forEach(函数(名称、索引){ 警报(this.obj[名称]) }) } } objct={ n1:1, n2:2 } var测试=新测试(objct) test.change()这是因为您传递到forEach()的函数的函数上下文(this)现在是window,它不再是您的test实例 如果改用箭头函数,则可以保留词法范围,并且this将指向当前(T

假设我有以下代码:

类测试{
建造师(obj){
this.obj=obj
}
更改(){
Object.keys(this.obj).forEach(函数(名称、索引){
警报(this.obj[名称])
})
}
}
objct={
n1:1,
n2:2
}
var测试=新测试(objct)

test.change()
这是因为您传递到
forEach()
的函数的函数上下文(this)现在是
window
,它不再是您的
test
实例

如果改用箭头函数,则可以保留词法范围,并且
this
将指向当前(
Test
)实例:

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

请参见

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

旧方法:在这个解决方案中,我们在变量
self

类测试{
建造师(obj){
this.obj=obj
}
更改(){
var self=这个
Object.keys(this.obj).forEach(函数(名称、索引){
警报(self.obj[名称])
})
}
}
objct={
n1:1,
n2:2
}
var测试=新测试(objct)

test.change()
匿名函数未绑定到上下文,因此它们无权访问此
;但是箭头函数是不正确的。所以用它来代替

类测试{
建造师(obj){
this.obj=obj
}
更改(){
Object.keys(this.obj).forEach((名称,索引)=>{
警报(this.obj[名称])
})
}
}
objct={
n1:1,
n2:2
}
var测试=新测试(objct)

test.change()
Javascript中的经典范围课程

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

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

change() {
  Object.keys(this.obj).forEach(function(name, index) {
    alert(this.obj[name])
  }.bind(this))
  }
change() {
  Object.keys(this.obj).forEach((name, index) => {
    alert(this.obj[name])
  })
  }
使用
=>
,这是将forEach的作用域绑定到父函数的另一种方式

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

尝试将此函数:函数(名称,索引){alert(this.obj[name])}更改为箭头函数以获取“this”上下文只需不使用
forEach
。在
中为…使用
,或在
中为…使用
。实际上它是
未定义的
,而不是
窗口
。感谢您的回答,了解self很有意思,以前没有使用过它。JS变化很快:)谢谢你的回答。使用旧浏览器兼容性时,bind看起来是一个解决方法:)(是的,我不喜欢babel)