Les réponses précédentes ne vous a donné des exemples de code sur la façon de le corriger; Permettez-moi de vous expliquer votre problème et pourquoi il se passe
Dans votre exemple de code, la fonction à l'intérieur de votre setTimeout est lié à la valeur this
du setTimeout (qui est généralement window
ou undefined
en mode strict).
setTimeout(function() {
// this === window
}, 1000);
En ES6, ils ont introduit des expressions lambda (fonctions de direction) qui sont "liés lexicalement" - ce qui signifie qu'ils empruntent la valeur this
de leur champ extérieur. Dans votre cas, c'est la classe/l'objet.
Afin de tirer parti de la expression lambda s, il ressemblerait à ceci:
class Foo {
constructor() {
setTimeout(() => this.myMethod(), 1000);
}
myMethod() {
console.log('foo');
}
}
Si vous utilisez Babel transpile votre code, et utilisez les fonctionnalités expérimentales, vous pouvez utiliser La syntaxe de l'ES7 vous permet également de résoudre votre problème avec la syntaxe.
Si vous liez une fonction/méthode, elle crée une copie de cette fonction et lie la valeur this
à celle que vous choisissez. Cela vous permettra d'utiliser l'instruction function
qui sera liée à votre classe/objet.
<context to be bound> :: <function to receive context>
class Foo {
constructor() {
setTimeout(this::function() {
this.myMethod();
}, 1000);
}
myMethod() {
console.log('foo');
}
}
Une version encore plus courte ressemblerait à quelque chose comme ce qui suit
constructor() {
setTimeout(this::this.myMethod, 1000);
}
Si vous rencontrez toujours des problèmes de compréhension, je vous suggère de lire plus sur les classes de ES6 et javascript contraignant .
Si vous deviez définir 'self' vous le feriez dans le constructeur, pas dans la classe. Mais il suffit d'utiliser une fonction de flèche comme @Buzinas dit. – JMM