JavaScript/Objekte/Propertydescriptor
Die Eigenschaften eines JavaScript-Objekts sind nicht alle gleich. Sie können schreibgeschützt sein, sie können vor Aufzählungsfunktionen wie Object.keys() versteckt werden, und sie können statt eines Wertes Funktionen besitzen, die den Eigenschaftswert ermitteln.
Wie sich eine Objekteigenschaft verhält, definiert ihr Propertydescriptor. Dabei handelt es sich um ein Objekt mit 4 Eigenschaften, und es gibt sie in zwei Varianten: Datendeskriptoren und Accessor-Deskriptoren.
Wenn Sie einem Objekt einfach eine Eigenschaft zuweisen, ohne vorher einen Deskriptor gesetzt zu haben, entsteht ein Datendeskriptor, für den die Defaultwerte gesetzt sind.
Zum Arbeiten mit Propertydescriptoren dienen diese Methoden:
- Object.getOwnPropertyDescriptor - Lesen des Deskriptors für ein einzelne Eigenschaft
- Object.getOwnPropertyDescriptors - Lesen der Deskriptoren aller Eigenschaften eines Objekts
- Object.defineProperty - Setzt den Deskriptor für eine Eigenschaft. Sofern die Eigenschaft schon existierte, wird sie überschrieben.
- Object.defineProperties - Setzt Deskriptoren für mehrere Eigenschaften auf einmal.
- Object.create - Erzeugt ein neues Objekt mit einem vorgegebenen Prototyp und einer Liste von Deskriptoren.
Inhaltsverzeichnis
Gemeinsamkeiten
Beiden Deskriptortypen gemeinsam sind die Eigenschaften enumerable
und configurable
.
enumerable
- Standardwert:
true
. Diese Eigenschaft kann auffalse
gesetzt werden, um die zugehörige Eigenschaft vor einigen Methoden, die die Eigenschaften eines Objekts durchlaufen können, zu verbergen. Dies sind- die Methode Object.keys
- die Methode Object.values
- die Methode Object.entries
- die for...in-Schleife
- die Kopierfunktion von Object.assign
- der Spread-Operator
...
- Die folgenden Methoden gelten dagegen als technische Methoden und listen auch die Eigenschaften, bei denen
enumerable
auffalse
gesetzt ist.
configurable
- Standardwert:
true
. Diese Eigenschaft bildet eine Falltüre. Ist sie für ein Property einmal auffalse
gesetzt, lässt sich sein Propertydeskriptor nicht mehr ändern.
Datendeskriptoren
Eigenschaften mit Datendeskriptoren stellen einen einfachen Speicherplatz im Objekt dar. Datendeskriptoren verfügen über die zusätzlichen Eigenschaften
writable
- Standardwert:
true
. Wird diese Eigenschaft auf false gesetzt, kann der Wert des Propertys nur noch gelesen werden. Achten Sie darauf, nicht versehentlichwriteable
zu verwenden. Beide Schreibweisen sind im Wörterbuch richtig, in JavaScript aber nur eine. value
- Standardwert:
undefined
. Diese Eigenschaft enthält den Wert des Propertys. Es handelt sich aber nicht um eine Live-Beziehung, der Wert invalue
wird lediglich beim Setzen des Propertydeskriptors in das Property übertragen und beim Lesen des Propertydeskriptors mit dem Wert des Propertys gefüllt.
Accessor-Deskriptoren
Ein Accessor-Deskriptor definiert eine Eigenschaft, bei denen der Zugriff auf den Wert über Funktionsaufrufe erfolgt. Diese Deskriptoren besitzen zwei zusätzlichen Eigenschaften, in denen die erforderlichen Funktionen hinterlegt werden. Solche Funktionen heißen accessor, daher die Bezeichnung für den Deskriptor.
get
- Standardwert:
undefined
. Eine Funktion, die aufgerufen wird, wenn die Eigenschaft gelesen werden soll. Sie bekommt keine Parameter, und ihr Rückgabewert stellt den Wert der Eigenschaft dar. set
- Standardwert:
undefined
. Eine Funktion, die aufgerufen wird, wenn die Eigenschaft geschrieben werden soll. Sie erhält einen Parameter, der den zuzuweisenden Wert darstellt. Ihr Rückgabewert ist ohne Bedeutung.
Die Accessor-Funktionen werden wie Methoden des Objekts aufgerufen, zu dem der Propertydescriptor gehört. Das heißt: in this
finden Sie beim Aufruf das Objekt vor, auf dem die Eigenschaft gelesen oder geschrieben werden soll.
Um ein Accessor-Deskriptor zu sein, muss ein Propertydeskriptor die get
- oder set
-Eigenschaft besitzen. Fehlen beide, ist er automatisch ein Datendeskriptor. Sobald der Deskriptor die get
- oder set
-Eigenschaft besitzt, dürfen die Eigenschaften writable
oder value
nicht mehr verwendet werden.
Ein Accessor-Deskriptor kann nur die get
-Funktion enthalten und definiert damit eine readonly-Eigenschaft. Er kann auch nur die set
-Funktion enthalten. Das ist ein eher exotisches Szenario, aber auch writeonly-Eigenschaften können eine Bedeutung haben.
ToDo (weitere ToDos)