Cette page a été traduite à partir de l'anglais par la communauté. Vous pouvez contribuer en rejoignant la communauté francophone sur MDN Web Docs.

View in English Always switch to English

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

js
new Iterator()

Note : Iterator() peut seulement être construit avec new. Tenter de l'appeler sans new lance une TypeError. De plus, Iterator() ne peut pas être construit lui-même — il est généralement construit implicitement via des appels à super() à l'intérieur du constructeur d'une sous-classe.

Paramètres

Aucun.

Valeur de retour

Un nouvel objet Iterator.

Exceptions

TypeError

Lorsque new.target est la fonction Iterator elle-même, c'est-à-dire lorsque le constructeur Iterator est 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 :

js
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 de Generator.prototype vont 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é.

js
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>

Compatibilité des navigateurs

Voir aussi