Movatterモバイル変換


[0]ホーム

URL:


  1. Web
  2. JavaScript
  3. JavaScript-Referenz
  4. Eingebaute Standardobjekte
  5. Iterator
  6. Iterator()

Dieser Inhalt wurde automatisch aus dem Englischen übersetzt, und kann Fehler enthalten.Erfahre mehr über dieses Experiment.

View in EnglishAlways switch to English

Iterator() Konstruktor

Baseline 2025
Newly available

Since ⁨March 2025⁩, this feature works across the latest devices and browser versions. This feature might not work in older devices or browsers.

DerIterator() Konstruktor ist vorgesehen, alsOberklasse anderer Klassen verwendet zu werden, die Iteratoren erstellen. Er erzeugt einen Fehler, wenn er alleine instanziiert wird.

Syntax

js
new Iterator()

Hinweis:Iterator() kann nur mitnew konstruiert werden. Der Versuch, ihn ohnenew aufzurufen, löst einenTypeError aus. Außerdem kannIterator() nicht wirklich selbst konstruiert werden – es wird normalerweise implizit durchsuper() Aufrufe innerhalb des Konstruktors einer Unterklasse konstruiert.

Parameter

Keine.

Rückgabewert

Ein neuesIterator Objekt.

Ausnahmen

TypeError

Wennnew.target dieIterator Funktion selbst ist, d.h. wenn derIterator Konstruktor selbst konstruiert wird.

Beschreibung

Iterator stellt eineabstrakte Klasse dar — eine Klasse, die allgemeine Dienstprogramme für ihre Unterklassen bereitstellt, aber nicht selbst instanziiert werden soll. Sie ist die Oberklasse aller anderen Iterator-Klassen und wird verwendet, um Unterklassen zu erstellen, die spezifische Iterationsalgorithmen implementieren — nämlich müssen alle Unterklassen vonIterator einenext() Methode implementieren, wie es dasIterator-Protokoll erfordert. DaIterator dienext() Methode tatsächlich nicht bereitstellt, macht es keinen Sinn, einenIterator direkt zu konstruieren.

Sie können auchIterator.from() verwenden, um eineIterator Instanz aus einem vorhandenen iterierbaren oder Iterator-Objekt zu erstellen.

Beispiele

Unterklassen von Iterator

Das folgende Beispiel definiert eine benutzerdefinierte Datenstruktur,Range, die Iteration ermöglicht. Um ein Objekt iterierbar zu machen, können wir eine[Symbol.iterator]() Methode in Form einer Generatorfunktion bereitstellen:

js
class Range {  #start;  #end;  #step;  constructor(start, end, step = 1) {    this.#start = start;    this.#end = end;    this.#step = step;  }  *[Symbol.iterator]() {    for (let value = this.#start; value <= this.#end; value += this.#step) {      yield value;    }  }}const range = new Range(1, 5);for (const num of range) {  console.log(num);}

Dies funktioniert, ist aber nicht so elegant wie die Arbeitsweise eingebauter Iteratoren. Es gibt zwei Probleme:

  • Der zurückgegebene Iterator erbt vonGenerator, was bedeutet, dass Änderungen anGenerator.prototype den zurückgegebenen Iterator beeinflussen, was ein Abstraktionsleck darstellt.
  • Der zurückgegebene Iterator erbt nicht von einem benutzerdefinierten Prototyp, wodurch es schwieriger wird, wenn wir zusätzliche Methoden zum Iterator hinzufügen möchten.

Wir können die Implementierung eingebauter Iteratoren, wie z.B.Map-Iteratoren, nachahmen, indem wirIterator als Unterklasse verwenden. Dies ermöglicht es uns, zusätzliche Eigenschaften zu definieren, wie z.B.[Symbol.toStringTag], während die Iterator-Hilfsmethoden auf dem zurückgegebenen Iterator verfügbar sind.

js
class Range {  #start;  #end;  #step;  constructor(start, end, step = 1) {    this.#start = start;    this.#end = end;    this.#step = step;  }  static #RangeIterator = class extends Iterator {    #cur;    #s;    #e;    constructor(range) {      super();      this.#cur = range.#start;      this.#s = range.#step;      this.#e = range.#end;    }    static {      Object.defineProperty(this.prototype, Symbol.toStringTag, {        value: "Range Iterator",        configurable: true,        enumerable: false,        writable: false,      });      // Avoid #RangeIterator from being accessible outside      delete this.prototype.constructor;    }    next() {      if (this.#cur > this.#e) {        return { value: undefined, done: true };      }      const res = { value: this.#cur, done: false };      this.#cur += this.#s;      return res;    }  };  [Symbol.iterator]() {    return new Range.#RangeIterator(this);  }}const range = new Range(1, 5);for (const num of range) {  console.log(num);}

Das Unterklassenmuster ist nützlich, wenn Sie viele benutzerdefinierte Iteratoren erstellen möchten. Wenn Sie ein vorhandenes iterierbares oder Iterator-Objekt haben, das nicht vonIterator erbt, und Sie nur die Iterator-Hilfsmethoden aufrufen möchten, können SieIterator.from() verwenden, um eine einmaligeIterator Instanz zu erstellen.

Spezifikationen

Specification
ECMAScript® 2026 Language Specification
# sec-iterator-constructor

Browser-Kompatibilität

Siehe auch

Help improve MDN

Learn how to contribute Diese Seite wurde automatisch aus dem Englischen übersetzt.

[8]ページ先頭

©2009-2025 Movatter.jp