JavaScript-Standard ECMAScript 2022 führt private Properties ein

Neben erweiterten Feldern bringt ES2022 Top-Level Await und einen erweiterten Zugriff auf einzelne Elemente in Arrays und Strings.

In Pocket speichern vorlesen Druckansicht 24 Kommentare lesen

(Bild: Trismegist san/Shutterstock.com)

Lesezeit: 4 Min.
Von
  • Rainald Menge-Sonnentag
Inhaltsverzeichnis

Ecma International hat mit ECMAScript 2022 den aktuellen Sprachstandard für JavaScript freigegeben. Die dreizehnte Auflage der seit 1997 veröffentlichten Spezifikation erweitert die Properties von Objekten unter anderem um private Felder. Die at()-Methode erlaubt den Zugriff auf indizierbare Typen mit negativen Indizies, und für asynchrone Programmausführung existiert nun Await auf Modulebene.

Neben den technischen Neuerungen ist eine rechtliche Ergänzung nennenswert: Neben der bisherigen Ecma-International-Lizenz existiert für den aktuellen Standard eine alternative Vereinbarung, die an die Lizenz des World Wide Web Consortium (W3C) angelehnt ist. Mozilla hatte die Ergänzung dem Standardisierungskomitee vorgeschlagen, das sie im März aktzeptiert hat. Die Alternative erlaubt mehr Freiheit für abgeleitete Projekte und soll die Lizenzierung im Zusammenspiel mit W3C-Spezifikationen vereinfachen.

Die vollständigen Copyright-Vorgaben mit beiden Lizenzen finden sich auf der Ecma-International-Site. Sie gelten sowohl für die unter ECMA-262 geführte Spezifikation der Sprache als auch für die zugehörige Internationalsierungs-API ECMA-402.

ES2022 erweitert die Properties von Klassen und kennt nun insgesamt vier Arten von Feldern: öffentliche und private Instanzfelder sowie öffentliche und private statische Felder. Wie bei anderen Programmiersprachen ist der Zugriff auf die privaten Felder von außerhalb der Klasse untersagt. Die Instance Fields existieren für jede Instanz der Klasse, während die statischen nur einmal für alle Instanzen existieren.

class simpleclass {
  publicInstanceField = 123;          // wie bisherige Property
  static publicStaticField = "abc";   // fuer alle Instanzen

  #privateInstanceField = 789;        // Zugriff nur aus der Klasse
  static #privateStaticField = "xyz"; // privat und statisch
}

Der Operator in prüft, ob ein Objekt ein bestimmtes privates Feld hat. Das zugehörige ECMA-Proposal lief unter dem Nemen "Ergonomic brand checks for Private Fields". Microsofts JavaScript-Superset TypeScript hat eine entsprechende Funktionsweise Ende 2021 in Version 4.5 eingeführt.

Neben Feldern können Methoden sowie Getter und Setter als privat deklariert sein. Die privaten Elemente haben ein führendes #, und der Zugriff ist nur aus der direkten Klasse, also nicht aus Kindklassen erlaubt.

Ebenfalls neu sind statische Blöcke static{ ... } zum Initialisieren statischer Klassenelementen als Gegenstück zum Konstruktor, der die Elemente innerhalb der jeweiligen Instanz initialisiert.

Die neue Methode hasOwn() prüft, ob eine Objekt eine Property besitzt und selbst deklariert, also nicht von einem Elternobjekt geerbt hat. Die Methode ist eine einfachere und wohl in manchen Fällen zuverlässigere Alternative zu Object.prototype.hasOwnProperty.

Eine weitere größere Neuerung ist Top-Level await: Damit lassen sich asynchrone Vorgänge auf Modulebene auch außerhalb asynchroner Funktionen umsetzen. Sinnvoll ist der Einsatz unter anderem, um die potenziell langwierige Initialisierung eines Moduls asynchron ablaufen zu lassen, wenn es beispielsweise über fetch externen Ressourcen lädt.

// simple-modul.msj
const response = await fetch('https://meine-site.de');
const someJson = await.response.json(); 

Module, die Top-Level await verwenden, gelten ebenso als asynchron wie Module, die andere asynchrone Module importieren. Googles JavaScript-Engine V8 verarbeitet bereits seit der Mitte 2021 veröffentlichten Version 9.1 Top-Level-Await-Module.

Die Methode at() greift auf indizierbare Elemente wie Strings und Arrays und TypedArrays auf ähnliche Weise zu wie der Operator []. Im Gegensatz zu Letzterem erlaubt die Methode zusätzlich negative Indizes, über die der Zugriff vom Ende des Elements her betrachtet erfolgt:

const arr = ['a', 'b', 'c', 'd'];
ele = arr.at(0);  // 'a'
ele = arr.at(-1); // 'd'

Eine Neuerungen betrifft reguläre Ausdrücke. Sie lassen sich neuerdings mit dem Flag /d versehen, um den Start- und Endindex für Substrings mitzugeben.

Die Klasse Error bekommt in ES2022 die Property cause, mit der sich ein anderes Error-Objekt als Ursache des aktuellen Fehlers angeben lässt:

try {
  // ... 
} 
catch (someError) 
{
  throw new Error('Fehler gefunden', {cause: someError});
}

Die vollständige ECMAScript-2022-Spezifikation findet sich bei Ecma International. Einen ersten Vorgeschmack auf die für kommendes Jahr zu erwartenden Neuerungen vermitteln diejenigen Vorschläge, die im GitHub-Repository des TC39, dem Ecma-International-Standardisierungskomitee, auf der dritten von vier Stufen stehen. Dazu gehören unter anderem Decorators sowie Objekte und Funktionen, um Datums- und Zeitangaben zu verarbeiten.

(rme)