Depuis que je suis en train de saisir le concept de iterables en JavaScript, je construit un avec le code suivant:Comment le mot-clé "this" fonctionne-t-il avec les objets en JavaScript?
let range = {
from: 0,
to: 5
};
range[Symbol.iterator] = function() {
return {
current: this.from,
last: this.to,
next() {
if (this.current <= this.last) {
return { done: false, value: this.current++ };
} else {
return { done: true };
}
}
};
};
for (let num of range) {
console.log(num);
}
La méthode Symbol.iterator
retourne un objet qui contient une méthode (next
) et deux propriétés (current
et from
). Les propriétés de cet objet sont égales aux propriétés de l'objet range
.
Depuis current
égal this.from
et last
égal this.to
, je suppose que je pourrais utiliser this.from
et this.to
directement à partir de la méthode next
comme si:
let range = {
from: 0,
to: 5
};
range[Symbol.iterator] = function() {
return {
next() {
if (this.from <= this.to) {
return { done: false, value: this.from++ };
} else {
return { done: true };
}
}
};
};
for (let num of range) {
console.log(num);
}
Cependant, cela empêche l'itération de démarrer. Ayant observé cela, j'ai deux questions:
Pourquoi peut les propriétés
current
etlast
utiliser le mot cléthis
et l'ont référence à l'objetrange
alors que la méthode ne peut pasnext
?current
,last
etnext()
font tous partie du même objet, qui est retourné parSymbol.iterator
.En outre, étant donné que
Symbol.iterator()
renvoie un objet séparé, ne devrait pas le mot-cléthis
dans cet objet se référer à cet objet lui-même? En d'autres termes, les propriétéscurrent
etlast
et non ne devraient pas pouvoir accéder aux propriétés derange
en utilisant le mot-cléthis
? Lerange
n'est-il pas un objet distinct?
Une utilisation de 'this' est à l'intérieur de la méthode' [Symbol.iterator] ', l'autre dans la méthode' .next'. Les littéraux d'objets n'ont pas d'importance, ils n'ont pas leur propre portée. – Bergi