在迭代中强制JavaScript方法使用类的属性而不是当前对象的属性
我在JavaScript类中有在迭代中强制JavaScript方法使用类的属性而不是当前对象的属性,javascript,javascript-objects,Javascript,Javascript Objects,我在JavaScript类中有用户数组(对象)。每个用户都有一个isActive属性。我创建了一个setUserStatus,用于修改每个用户中提到的属性: class usersGroupMake{ 构造函数(){ this.isGroupActive=true; 这是一个组={ groupId:1, 用户:[{ 名字:“约翰”, 姓:“霍普金斯”, 是的 }, { 名字:“蒂姆”, 姓:“库克”, 是的 }, { 名字:'结婚', 姓氏:“史密斯”, 是的 } ] }; this.setU
用户
数组(对象)。每个用户都有一个isActive
属性。我创建了一个setUserStatus
,用于修改每个用户中提到的属性:
class usersGroupMake{
构造函数(){
this.isGroupActive=true;
这是一个组={
groupId:1,
用户:[{
名字:“约翰”,
姓:“霍普金斯”,
是的
},
{
名字:“蒂姆”,
姓:“库克”,
是的
},
{
名字:'结婚',
姓氏:“史密斯”,
是的
}
]
};
this.setUserStatus=函数(){
this.groups.users.forEach(函数(用户)){
user.isActive=user.isActive&&this.isGroupActive;
});
}
}
}
var userGroup1=new usersGroupMake();
userGroup1.setUserStatus();
log(userGroup1.groups.users)代码>您可以做两件事:
首先,您可以在.forEach()
之前的函数中保存对this
的引用:
其次,可以使用箭头功能:
this.setUserStatus = function(){
this.groups.users.forEach(user => {
user.isActive = user.isActive && this.isGroupActive;
});
}
编辑-我想第三种方法是利用.forEach()
API,并提供一个明确的this
:
this.setUserStatus = function(){
this.groups.users.forEach(function(user) {
user.isActive = user.isActive && this.isGroupActive;
}, this);
}
您可以使用的thisArg
class usersGroupMake{
构造函数(){
this.isGroupActive=true;
这是一个组={
groupId:1,
用户:[{
名字:“约翰”,
姓:“霍普金斯”,
是的
},
{
名字:“蒂姆”,
姓:“库克”,
是的
},
{
名字:'结婚',
姓氏:“史密斯”,
是的
}
]
};
this.setUserStatus=函数(){
this.groups.users.forEach(函数(用户)){
user.isActive=user.isActive&&this.isGroupActive;
},这是另一种方式:
class usersGroupMake{
构造函数(){
this.isGroupActive=true;
这是一个组={
groupId:1,
用户:[{
名字:“约翰”,
姓:“霍普金斯”,
是的
},
{
名字:“蒂姆”,
姓:“库克”,
是的
},
{
名字:'结婚',
姓氏:“史密斯”,
是的
}
]
};
this.setUserStatus=函数(){
this.groups.users.map((用户)=>{
user.isActive=user.isActive&&this.isGroupActive;
});
}
}
}
var userGroup1=new usersGroupMake();
userGroup1.setUserStatus();
console.log(userGroup1.groups.users);
在回调中使用可能的重复项,此
不是当前用户,未定义。
this.setUserStatus = function(){
this.groups.users.forEach(function(user) {
user.isActive = user.isActive && this.isGroupActive;
}, this);
}