Get to know MDN better
Dieser Inhalt wurde automatisch aus dem Englischen übersetzt, und kann Fehler enthalten. Erfahre mehr über dieses Experiment.
Diese Funktion ist gut etabliert und funktioniert auf vielen Geräten und in vielen Browserversionen. Sie ist seit Juli 2021 browserübergreifend verfügbar.
Private Elemente sind Gegenstücke zu regulären Klassen-Elementen, die öffentlich sind, einschließlich Klassenfelder, Klassenmethoden usw. Private Elemente werden durch einen Hash-Präfix # erstellt und können außerhalb der Klasse nicht legal referenziert werden. Die Datenschutzeinkapselung dieser Klassenelemente wird von JavaScript selbst durchgesetzt. Der einzige Weg, um auf ein privates Element zuzugreifen, ist über die Punkt-Notation, und dies ist nur innerhalb der Klasse möglich, die das private Element definiert.
Private Elemente waren vor dem Vorhandensein dieser Syntax nicht nativ in der Sprache. In der prototypischen Vererbung kann ihr Verhalten mit WeakMap-Objekten oder Closures nachgeahmt werden, aber sie können im Hinblick auf Ergonomie nicht mit der #-Syntax verglichen werden.
Hinweis: Auf MDN vermeiden wir den Begriff "private Eigenschaft". Eine Eigenschaft in JavaScript hat einen Zeichenfolgen- oder Symbol-Schlüssel und Attribute wie writable, enumerable und configurable, aber private Elemente haben keine dieser Attribute. Obwohl private Elemente mit der vertrauten Punkt-Notation zugegriffen werden, können sie nicht proxy-fähig gemacht, aufgezählt, gelöscht oder mit einer Object Methode interagiert werden.
Es gibt einige zusätzliche Syntaxbeschränkungen:
Die meisten Klassenelemente haben ihre privaten Gegenstücke:
Diese Funktionen werden zusammenfassend als private Elemente bezeichnet. Allerdings können Konstruktoren in JavaScript nicht privat sein. Um zu verhindern, dass Klassen außerhalb der Klasse instanziiert werden, müssen Sie eine private Flagge verwenden.
Private Elemente werden mit # Namen (ausgesprochen „Hash-Namen“) deklariert, d.h. Bezeichner, die mit # beginnen. Das Hash-Präfix ist ein wesentlicher Bestandteil des Eigenschaftennamens — man kann es mit der alten Unterstrich-Präfix-Konvention _privateField in Verbindung bringen — aber es ist keine gewöhnliche Zeichenfolgen-Eigenschaft, daher kann man nicht dynamisch mit der Klammer-Notation darauf zugreifen.
Es ist ein Syntaxfehler, auf #-Namen außerhalb der Klasse zu verweisen. Es ist auch ein Syntaxfehler, auf private Elemente zu verweisen, die nicht im Klassenrumpf deklariert wurden, oder zu versuchen, deklarierte Elemente mit delete zu entfernen.
JavaScript, als dynamische Sprache, ist in der Lage, diese Überprüfung zur Kompilierzeit durchzuführen, dank der speziellen Hash-Bezeichner-Syntax, die sie auf der Syntaxebene von normalen Eigenschaften unterscheidet.
Hinweis: Code, der in der Chrome-Konsole ausgeführt wird, kann auf private Elemente außerhalb der Klasse zugreifen. Dies ist eine nur in DevTools geltende Entspannung der JavaScript-Syntaxbeschränkung.
Wenn Sie auf ein privates Element von einem Objekt zugreifen, das das Element nicht hat, wird ein TypeError ausgelöst, anstatt wie bei normalen Eigenschaften undefined zurückzugeben.
Dieses Beispiel zeigt auch, dass Sie auf private Elemente innerhalb von statischen Funktionen und auch auf extern definierte Instanzen der Klasse zugreifen können.
Sie können den in Operator verwenden, um zu überprüfen, ob ein extern definiertes Objekt ein privates Element besitzt. Dies gibt true zurück, wenn das private Feld oder die private Methode existiert, und false andernfalls.
Beachten Sie einen Korollar aus privaten Namen, die immer vor-deklariert und nicht löschbar sind: Wenn Sie festgestellt haben, dass ein Objekt ein privates Element der aktuellen Klasse besitzt (entweder aus einem try...catch oder einer in-Prüfung), muss es alle anderen privaten Elemente besitzen. Dass ein Objekt die privaten Elemente einer Klasse besitzt, bedeutet in der Regel, dass es von dieser Klasse konstruiert wurde (obwohl nicht immer).
Private Elemente sind kein Teil des prototypischen Vererbung-Modells, da sie nur innerhalb des Körper der aktuellen Klasse zugänglich sind und nicht von Unterklassen geerbt werden. Private Elemente mit demselben Namen in verschiedenen Klassen sind völlig unterschiedlich und arbeiten nicht miteinander. Betrachten Sie sie als externe Metadaten, die an jede Instanz angehängt und von der Klasse verwaltet werden. Aus diesem Grund klont structuredClone() keine privaten Elemente und Object.freeze() sowie Object.seal() haben keine Auswirkungen auf private Elemente.
Für weitere Informationen darüber, wie und wann private Felder initialisiert werden, siehe öffentliche Klassenfelder.
Private Felder umfassen private Instanzfelder und private statische Felder. Private Felder sind nur innerhalb der Klassendeklaration zugänglich.
Wie ihre öffentlichen Gegenstücke, private Instanzfelder:
Hinweis: #privateField aus der ClassWithPrivateField Basisklasse ist privat für ClassWithPrivateField und von der abgeleiteten Subclass nicht zugänglich.
Ein Konstruktor einer Klasse kann ein anderes Objekt zurückgeben, das als neues this für den Konstruktor der abgeleiteten Klasse verwendet wird. Die abgeleitete Klasse kann dann private Felder auf diesem zurückgegebenen Objekt definieren — was bedeutet, dass es möglich ist, private Felder auf nicht verwandte Objekte zu "stempeln".
Warnung: Dies ist potenziell sehr verwirrend. Es wird im Allgemeinen empfohlen, nichts vom Konstruktor zurückzugeben — insbesondere nichts, das nicht mit this zu tun hat.
Wie ihre öffentlichen Gegenstücke, private statische Felder:
Es gibt eine Einschränkung für private statische Felder: Nur die Klasse, die das private statische Feld definiert, kann auf das Feld zugreifen. Dies kann zu unerwartetem Verhalten führen, wenn this verwendet wird. Im folgenden Beispiel bezieht sich this auf die Subclass Klasse (nicht auf die ClassWithPrivateStaticField Klasse), wenn wir versuchen, Subclass.publicStaticMethod() aufzurufen, und verursacht daher einen TypeError.
Dies ist das gleiche, wenn Sie die Methode mit super aufrufen, da super-Methoden nicht mit der Superklasse als this aufgerufen werden.
Es wird empfohlen, auf private statische Felder immer über den Klassennamen zuzugreifen und nicht über this, damit die Vererbung die Methode nicht unterbricht.
Private Methoden umfassen private Instanzmethoden und private statische Methoden. Private Methoden sind nur innerhalb der Klassendeklaration zugänglich.
Im Gegensatz zu ihren öffentlichen Gegenstücken, private Instanzmethoden:
Private Instanzmethoden können Generator-, asynchrone oder asynchrone Generatorfunktionen sein. Private Getter und Setter sind ebenfalls möglich und folgen den gleichen Syntaxanforderungen wie ihre öffentlichen Getter und Setter Gegenstücke.
Im Gegensatz zu öffentlichen Methoden sind private Methoden nicht auf der .prototype-Eigenschaft ihrer Klasse zugänglich.
Wie ihre öffentlichen Gegenstücke, private statische Methoden:
Private statische Methoden können Generator-, asynchrone oder asynchrone Generatorfunktionen sein.
Die zuvor erwähnte Einschränkung für private statische Felder gilt auch für private statische Methoden und kann ebenfalls zu unerwartetem Verhalten führen, wenn this verwendet wird. Im folgenden Beispiel bezieht sich this auf die Subclass Klasse (nicht auf die ClassWithPrivateStaticMethod Klasse), wenn wir versuchen, Subclass.publicStaticMethod() aufzurufen, und verursacht daher einen TypeError.
Viele andere Sprachen bieten die Möglichkeit, einen Konstruktor als privat zu kennzeichnen, was verhindert, dass die Klasse außerhalb der Klasse selbst instanziiert wird — Sie können nur statische Fabrikmethoden verwenden, die Instanzen erstellen, oder gar keine Instanzen erstellen. JavaScript hat keine native Möglichkeit, dies zu tun, aber es kann durch die Verwendung einer privaten statischen Flag implementiert werden.
| ECMAScript® 2027 Language Specification # prod-PrivateIdentifier |
| ECMAScript® 2027 Language Specification # prod-00OK517S |
JavaScript aktivieren, um diese Browser-Kompatibilitätstabelle anzuzeigen.
JavaScript aktivieren, um diese Browser-Kompatibilitätstabelle anzuzeigen.
JavaScript aktivieren, um diese Browser-Kompatibilitätstabelle anzuzeigen.
Der Bauplan für ein besseres Internet.
Besuche die gemeinnützige Muttergesellschaft der Mozilla Corporation, die Mozilla Foundation.
Teile dieses Inhalts sind ©1998–2026 von einzelnen mozilla.org-Mitwirkenden. Inhalte sind verfügbar unter einer Creative-Commons-Lizenz.