Disons que j'ai le code suivant:
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()
Cependant, lorsque j'exécute ceci, j'obtiens l'erreur suivante:
Uncaught TypeError: Impossible de lire la propriété 'obj' de undefined
Je crois que cela signifie que ce n'est pas défini dans la fonction des clés d'objet. Comment puis-je accéder à this.obj à l'intérieur des clés Object et forloop?
Selon ce réponse , je peux utiliser map , mais j'ai besoin du nom de propriété et du tableau index à l'intérieur du forloop comme bien. Et voici un violon du code, si cela peut vous aider. Je vous remercie!!!
4 Réponses :
C'est parce que le contexte de fonction (le this ) de la fonction que vous passez dans forEach () est maintenant window et c'est n'est plus votre instance Test .
Si vous utilisez plutôt une fonction-flèche , vous pourrez conserver la portée lexicale em> et votre this pointerait vers l'instance actuelle ( Test ):
Object.keys(this.obj).forEach((name, index) =>
{
alert(this.obj[name])
});
Voir MDN
En fait, c'est indéfini , pas window .
this fait référence au contexte actuel de la fonction et donc dans votre exemple this.obj recherche obj dans le contexte de rappel de forEach . Vous pouvez résoudre ce problème en gardant une référence au contexte actuel, c'est-à-dire ceci OU en utilisant une fonction de flèche à la place. contexte actuel dans la variable self
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()
Solution préférée ou abrégée : en utilisant les fonctions fléchées
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()
merci pour la réponse, il était intéressant de se connaître, ne l'ayant jamais utilisé auparavant. JS évolue rapidement :)
Les fonctions anonymes ne sont pas liées au contexte, elles n'ont donc pas accès à this ; Mais les fonctions fléchées le sont. Utilisez-le à la place.
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()
Une leçon de portée classique en Javascript.
Il y a deux façons de faire cela:
En utilisant bind () qui lie la portée de votre forEach à la fonction parent
change() {
Object.keys(this.obj).forEach((name, index) => {
alert(this.obj[name])
})
}
en utilisant => qui est une autre façon de lier la portée de votre forEach à la fonction parente
change() {
Object.keys(this.obj).forEach(function(name, index) {
alert(this.obj[name])
}.bind(this))
}
Merci pour la réponse. bind ressemble à une solution de contournement lorsque vous travaillez avec une compatibilité de navigateur plus ancienne :) (oui, je n'aime pas babel)
essayez de changer cette fonction: function (name, index) {alert (this.obj [name])}) en une fonction de flèche pour obtenir le contexte 'this'
N'utilisez pas
forEach. Utilisezpour… dansoupour… sur.