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 2015 browserübergreifend verfügbar.
Die Object.defineProperty() statische Methode definiert eine neue Eigenschaft direkt auf einem Objekt oder ändert eine bestehende Eigenschaft auf einem Objekt und gibt das Objekt zurück.
Das Objekt, auf dem die Eigenschaft definiert werden soll.
propEin String oder Symbol, der den Schlüssel der zu definierenden oder zu ändernden Eigenschaft spezifiziert.
descriptorDer Deskriptor für die definierte oder geänderte Eigenschaft.
Das der Funktion übergebene Objekt, bei dem die angegebene Eigenschaft hinzugefügt oder geändert wurde.
Object.defineProperty() ermöglicht eine präzise Ergänzung oder Änderung einer Eigenschaft auf einem Objekt. Die normale Eigenschaftszuweisung durch Zuweisung erstellt Eigenschaften, die bei der Eigenschaftsaufzählung sichtbar sind (for...in, Object.keys(), etc.), deren Werte geändert werden können und die gelöscht werden können. Diese Methode erlaubt es, diese zusätzlichen Details von ihren Standardeinstellungen zu ändern. Standardmäßig sind Eigenschaften, die mit Object.defineProperty() hinzugefügt werden, nicht schreibbar, nicht aufzählbar und nicht konfigurierbar. Darüber hinaus verwendet Object.defineProperty() die interne Methode [[DefineOwnProperty]], anstatt [[Set]], sodass es keine Setter aufruft, selbst wenn die Eigenschaft bereits vorhanden ist.
Eigenschaftsdeskriptoren in Objekten gibt es in zwei Hauptarten: Daten-Deskriptoren und Accessor-Deskriptoren. Ein Daten-Deskriptor ist eine Eigenschaft mit einem Wert, der möglicherweise schreibbar ist oder nicht. Ein Accessor-Deskriptor ist eine Eigenschaft, die durch ein Getter-Setter-Paar von Funktionen beschrieben wird. Ein Deskriptor muss eine dieser beiden Arten sein; er kann nicht beides sein.
Sowohl Daten- als auch Accessor-Deskriptoren sind Objekte. Sie teilen sich die folgenden optionalen Schlüssel (bitte beachten: die hier erwähnten Standardeinstellungen gelten bei der Definition von Eigenschaften mit Object.defineProperty()):
configurablewenn dies auf false gesetzt ist,
Standard ist false.
enumerabletrue nur dann, wenn diese Eigenschaft bei der Aufzählung der Eigenschaften auf dem entsprechenden Objekt sichtbar wird. Standard ist false.
Ein Daten-Deskriptor hat auch die folgenden optionalen Schlüssel:
valueDer mit der Eigenschaft verknüpfte Wert. Kann jeder gültige JavaScript-Wert sein (Zahl, Objekt, Funktion, etc.). Standard ist undefined.
writabletrue, wenn der mit der Eigenschaft verknüpfte Wert mit einem Zuweisungsoperator geändert werden kann. Standard ist false.
Ein Accessor-Deskriptor hat auch die folgenden optionalen Schlüssel:
getEine Funktion, die als Getter für die Eigenschaft dient, oder undefined, wenn es keinen Getter gibt. Wenn auf die Eigenschaft zugegriffen wird, wird diese Funktion ohne Argumente und mit this auf das Objekt gesetzt, durch das die Eigenschaft angesprochen wird (dies muss nicht das Objekt sein, auf dem die Eigenschaft definiert ist, durch Vererbung). Der Rückgabewert wird als Wert der Eigenschaft verwendet. Standard ist undefined.
setEine Funktion, die als Setter für die Eigenschaft dient, oder undefined, wenn es keinen Setter gibt. Wenn der Eigenschaft ein Wert zugewiesen wird, wird diese Funktion mit einem Argument (dem der Eigenschaft zugewiesenen Wert) und mit this auf das Objekt gesetzt, durch das die Eigenschaft zugewiesen wird, aufgerufen. Standard ist undefined.
Wenn ein Deskriptor keinen der value, writable, get und set Schlüssel hat, wird er als Daten-Deskriptor behandelt. Wenn ein Deskriptor sowohl ein Daten-Deskriptor (weil er value oder writable hat) als auch ein Accessor-Deskriptor (weil er get oder set hat) ist, wird eine Ausnahme ausgelöst.
Diese Attribute sind nicht zwangsläufig die eigenen Eigenschaften des Deskriptors. Geerbte Eigenschaften werden ebenfalls berücksichtigt. Um sicherzustellen, dass diese Standardeinstellungen beibehalten werden, können Sie bestehende Objekte in der Prototypenkette des Deskriptorobjekts im Voraus einfrieren, alle Optionen explizit angeben oder ein null-Prototyp-Objekt erstellen.
Wenn die Eigenschaft bereits existiert, versucht Object.defineProperty(), die Eigenschaft gemäß den Werten im Deskriptor und der aktuellen Konfiguration der Eigenschaft zu ändern.
Wenn das alte Deskriptor seine configurable Eigenschaft auf false gesetzt hat, wird die Eigenschaft als nicht konfigurierbar bezeichnet. Es ist nicht möglich, irgendwelche Attribute einer nicht konfigurierbaren Accessor-Eigenschaft zu ändern, und es ist nicht möglich, zwischen Daten- und Accessor-Eigenschaftstypen zu wechseln. Für Daten-Eigenschaften mit writable: true ist es möglich, den Wert zu ändern und das writable Attribut von true auf false zu ändern. Ein TypeError wird ausgelöst, wenn versucht wird, nicht konfigurierbare Eigenschaftenattribute zu ändern (außer value und writable, falls erlaubt), außer wenn ein Wert definiert wird, der derselbe wie der ursprüngliche Wert auf einer Daten-Eigenschaft ist.
Wenn die aktuelle Eigenschaft konfigurierbar ist, löscht die Definition eines Attributs auf undefined effektiv das Attribut. Zum Beispiel, wenn o.k eine Accessor-Eigenschaft ist, entfernt Object.defineProperty(o, "k", { set: undefined }) den Setter, wodurch k nur einen Getter hat und somit schreibgeschützt wird. Wenn ein Attribut im neuen Deskriptor fehlt, behält es den Wert des alten Deskriptor-Attributs (es wird nicht implizit auf undefined zurückgesetzt). Es ist möglich, zwischen Daten- und Accessor-Eigenschaften zu wechseln, indem man einen Deskriptor eines anderen "Typs" angibt. Zum Beispiel, wenn der neue Deskriptor ein Daten-Deskriptor ist (mit value oder writable), werden die get und set Attribute des ursprünglichen Deskriptors beide entfernt.
Wenn die angegebene Eigenschaft im Objekt nicht existiert, erstellt Object.defineProperty() eine neue Eigenschaft wie beschrieben. Felder können im Deskriptor weggelassen werden und Standardwerte für diese Felder werden eingefügt.
Beim Ändern einer vorhandenen Eigenschaft bestimmt die aktuelle Eigenschaftskonfiguration, ob der Operator erfolgreich ist, nichts tut oder einen TypeError auslöst.
Wenn das writable Eigenschaftsattribut false ist, wird die Eigenschaft als "nicht-schreibbar" bezeichnet. Sie kann nicht neu zugewiesen werden. Der Versuch, einer nicht-schreibbaren Eigenschaft einen neuen Wert zuzuweisen, ändert sie nicht und führt zu einem Fehler im striktem Modus.
Das enumerable Eigenschaftsattribut definiert, ob die Eigenschaft von Object.assign() oder dem Spread Operator berücksichtigt wird. Für nicht-Symbol Eigenschaften definiert es auch, ob sie in einer for...in Schleife und Object.keys() angezeigt werden oder nicht. Für weitere Informationen siehe Aufzählbarkeit und Eigentum von Eigenschaften.
Das configurable Attribut steuert, ob die Eigenschaft aus dem Objekt gelöscht werden kann und ob ihre Attribute (außer value und writable) geändert werden können.
Dieses Beispiel zeigt eine nicht konfigurierbare Accessor-Eigenschaft.
Wenn das configurable Attribut von o.a true gewesen wäre, würden keine Fehler ausgelöst werden und die Eigenschaft würde am Ende gelöscht werden.
Dieses Beispiel zeigt eine nicht konfigurierbare aber schreibbare Daten-Eigenschaft. Der value der Eigenschaft kann immer noch geändert werden, und writable kann immer noch von true auf false umgeschaltet werden.
Dieses Beispiel zeigt eine konfigurierbare, aber nicht schreibbare Daten-Eigenschaft. Der value der Eigenschaft kann immer noch mit defineProperty ersetzt werden (aber nicht mit Zuweisungsoperatoren), und writable kann umgeschaltet werden.
Dieses Beispiel zeigt eine nicht konfigurierbare und nicht schreibbare Daten-Eigenschaft. Es gibt keine Möglichkeit, irgendein Attribut der Eigenschaft zu aktualisieren, einschließlich ihres value.
Es ist wichtig, die Art und Weise zu berücksichtigen, wie Standardwerte von Attributen angewendet werden. Es gibt oft einen Unterschied zwischen der Verwendung von Eigenschafts-Accessoren zur Zuweisung eines Wertes und der Verwendung von Object.defineProperty(), wie im folgenden Beispiel gezeigt.
Das folgende Beispiel zeigt, wie ein sich selbst archivierendes Objekt implementiert werden kann. Wenn die temperature Eigenschaft gesetzt wird, erhält das archive Array einen Protokolleintrag.
In diesem Beispiel gibt ein Getter immer denselben Wert zurück.
Wenn eine Accessor-Eigenschaft vererbt wird, werden ihre get und set Methoden aufgerufen, wenn die Eigenschaft in Nachkommenobjekten angesprochen oder geändert wird. Wenn diese Methoden eine Variable verwenden, um den Wert zu speichern, wird dieser Wert von allen Objekten geteilt.
Dies kann behoben werden, indem der Wert in einer anderen Eigenschaft gespeichert wird. In get und set Methoden zeigt this auf das Objekt, das verwendet wird, um die Eigenschaft anzusprechen oder zu ändern.
Im Gegensatz zu Accessor-Eigenschaften werden Daten-Eigenschaften immer auf dem Objekt selbst und nicht auf einem Prototyp gesetzt. Wenn jedoch eine nicht schreibbare Daten-Eigenschaft vererbt wird, wird immer noch verhindert, dass sie auf dem Objekt geändert wird.
| ECMAScript® 2027 Language Specification # sec-object.defineproperty |
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.