Constructeur Iterator()
Baseline
2025
Newly available
Depuis March 2025, cette fonctionnalité fonctionne sur les appareils et les versions de navigateur les plus récents. Elle peut ne pas fonctionner sur les appareils ou navigateurs plus anciens.
Le constructeur Iterator() est destiné à être utilisé comme la superclasse d'autres classes qui créent des itérateurs. Il lève une erreur s'il est construit directement.
Syntaxe
new Iterator()
Paramètres
Aucun.
Valeur de retour
Un nouvel objet Iterator.
Exceptions
TypeError-
Lorsque
new.targetest la fonctionIteratorelle-même, c'est-à-dire lorsque le constructeurIteratorest construit.
Description
Iterator représente une classe abstraite — une classe qui fournit des utilitaires communs pour ses sous-classes, mais qui n'est pas destinée à être instanciée elle-même. C'est la superclasse de toutes les autres classes d'itérateurs, et elle est utilisée pour créer des sous-classes qui implémentent des algorithmes d'itération spécifiques — en particulier, toutes les sous-classes de Iterator doivent implémenter une méthode next() comme requis par le protocole d'itérateur. Comme Iterator ne fournit pas réellement la méthode next(), il n'est pas logique de construire un Iterator directement.
Vous pouvez également utiliser Iterator.from() pour créer une instance de Iterator à partir d'un objet itérable ou itérateur existant.
Exemples
>Sous-classer Iterator
L'exemple suivant définit une structure de données personnalisée, Range, qui permet l'itération. Pour rendre un objet itérable, nous pouvons fournir une méthode [Symbol.iterator]() sous la forme d'une fonction génératrice :
class Range {
#debut;
#fin;
#etape;
constructor(debut, fin, etape = 1) {
this.#debut = debut;
this.#fin = fin;
this.#etape = etape;
}
*[Symbol.iterator]() {
for (let valeur = this.#debut; valeur <= this.#fin; valeur += this.#etape) {
yield valeur;
}
}
}
const fourchette = new Range(1, 5);
for (const nombre of fourchette) {
console.log(nombre);
}
Ça fonctionne, mais ce n'est pas aussi agréable que le fonctionnement des itérateurs intégrés. Il y a deux problèmes :
- L'itérateur retourné hérite de
Generator, ce qui signifie que les modifications deGenerator.prototypevont affecter l'itérateur retourné, constituant une fuite d'abstraction. - L'itérateur retourné n'hérite pas d'un prototype personnalisé, ce qui complique l'ajout de méthodes supplémentaires à l'itérateur.
Nous pouvons imiter l'implémentation des itérateurs natifs, tels que l'itérateurs de map, en sous-classant Iterator. Cela permet de définir des propriétés supplémentaires, telles que [Symbol.toStringTag], tout en rendant disponibles les méthodes d'aide à l'itérateur sur l'itérateur retourné.
class Plage {
#debut;
#fin;
#etape;
constructor(debut, fin, etape = 1) {
this.#debut = debut;
this.#fin = fin;
this.#etape = etape;
}
static #PlageIterator = class extends Iterator {
#act;
#e;
#f;
constructor(range) {
super();
this.#act = range.#debut;
this.#e = range.#etape;
this.#f = range.#fin;
}
static {
Object.defineProperty(this.prototype, Symbol.toStringTag, {
value: "Plage Iterator",
configurable: true,
enumerable: false,
writable: false,
});
// Empêcher #PlageIterator d'etre accessible a l'exterieur
delete this.prototype.constructor;
}
next() {
if (this.#act > this.#f) {
return { valeur: undefined, fait: true };
}
const res = { valeur: this.#act, fait: false };
this.#act += this.#e;
return res;
}
};
[Symbol.iterator]() {
return new Plage.#PlageIterator(this);
}
}
const plage = new Plage(1, 5);
for (const nombre of plage) {
console.log(nombre);
}
Le modèle de sous-classement est utile si vous souhaitez créer de nombreux itérateurs personnalisés. Si vous avez un objet itérable ou un itérateur existant qui n'hérite pas de Iterator, et que vous souhaitez simplement appeler les méthodes d'aide de l'itérateur dessus, vous pouvez utiliser Iterator.from() pour créer une instance Iterator ponctuelle.
Spécifications
| Specification |
|---|
| ECMAScript® 2026 Language Specification> # sec-iterator-constructor> |