handler.getOwnPropertyDescriptor()
Baseline Widely available
This feature is well established and works across many devices and browser versions. It’s been available across browsers since September 2016.
Die Methode handler.getOwnPropertyDescriptor()
ist eine Trap für die [[GetOwnProperty]]
-interne Objektmethode, die bei Operationen wie Object.getOwnPropertyDescriptor()
verwendet wird.
Probieren Sie es aus
const monster1 = {
eyeCount: 4,
};
const handler1 = {
getOwnPropertyDescriptor(target, prop) {
console.log(`called: ${prop}`);
// Expected output: "called: eyeCount"
return { configurable: true, enumerable: true, value: 5 };
},
};
const proxy1 = new Proxy(monster1, handler1);
console.log(Object.getOwnPropertyDescriptor(proxy1, "eyeCount").value);
// Expected output: 5
Syntax
new Proxy(target, {
getOwnPropertyDescriptor(target, property) {
}
})
Parameter
Rückgabewert
Die Methode getOwnPropertyDescriptor()
muss ein Objekt oder undefined
zurückgeben, das den Eigenschafts-Deskriptor darstellt. Fehlende Attribute werden auf dieselbe Weise normalisiert wie bei Object.defineProperty()
.
Beschreibung
Abfangen von Operationen
Diese Trap kann die folgenden Operationen abfangen:
Oder jede andere Operation, die die [[GetOwnProperty]]
-interne Methode aufruft.
Invarianten
Die [[GetOwnProperty]]
-Methode des Proxys wirft einen TypeError
, wenn die Handler-Definition eine der folgenden Invarianten verletzt:
- Das Ergebnis muss entweder ein
Object
oderundefined
sein. - Eine Eigenschaft darf nicht als nicht-existent gemeldet werden, wenn sie als nicht konfigurierbare eigene Eigenschaft des Zielobjekts existiert. Das heißt, wenn
Reflect.getOwnPropertyDescriptor()
configurable: false
für die Eigenschaft auftarget
zurückgibt, darf die Trap nichtundefined
zurückgeben. - Eine Eigenschaft darf nicht als nicht-existent gemeldet werden, wenn sie als eigene Eigenschaft eines nicht erweiterbaren Zielobjekts existiert. Das heißt, wenn
Reflect.isExtensible()
für das Zielobjektfalse
zurückgibt, darf die Trap nichtundefined
zurückgeben. - Eine Eigenschaft darf nicht als existent gemeldet werden, wenn sie nicht als eigene Eigenschaft des Zielobjekts existiert und das Zielobjekt nicht erweiterbar ist. Das heißt, wenn
Reflect.isExtensible()
für das Zielobjektfalse
zurückgibt undReflect.getOwnPropertyDescriptor()
undefined
für die Eigenschaft auftarget
zurückgibt, dann muss die Trapundefined
zurückgeben. - Eine Eigenschaft darf nicht als nicht konfigurierbar gemeldet werden, wenn sie nicht als nicht konfigurierbare eigene Eigenschaft des Zielobjekts existiert. Das heißt, wenn
Reflect.getOwnPropertyDescriptor()
undefined
oderconfigurable: true
für die Eigenschaft auftarget
zurückgibt, darf die Trap nichtconfigurable: false
zurückgeben. - Eine Eigenschaft darf nicht als sowohl nicht konfigurierbar als auch nicht schreibbar gemeldet werden, es sei denn, sie existiert als nicht konfigurierbare, nicht schreibbare eigene Eigenschaft des Zielobjekts. Das heißt zusätzlich zu der vorherigen Invariante: Wenn
Reflect.getOwnPropertyDescriptor()
configurable: false, writable: true
für die Eigenschaft auftarget
zurückgibt, darf die Trap nichtconfigurable: false, writable: false
zurückgeben. - Wenn eine Eigenschaft eine entsprechende Eigenschaft auf dem Zielobjekt hat, dann muss der Deskriptor der Zielobjekt-Eigenschaft mit
descriptor
kompatibel sein. Das heißt, wenn man sich vorstellt, dasstarget
ein gewöhnliches Objekt ist, dann darfObject.defineProperty(target, property, resultObject)
keinen Fehler auslösen. Die Referenz zuObject.defineProperty()
enthält weitere Informationen, aber zusammengefasst gilt Folgendes: Wenn die Zieleigenschaft nicht konfigurierbar ist, muss Folgendes gelten:configurable
,enumerable
,get
undset
müssen identisch mit dem Original sein.writable
muss aufgrund der vorherigen Invariante ebenfalls das Original sein.- Die Eigenschaft muss entweder Daten- oder Accessor-Eigenschaft bleiben.
- Das Attribut
value
kann nur geändert werden, wennwritable
true
ist.
Beispiele
Abfangen von getOwnPropertyDescriptor
Der folgende Code fängt Object.getOwnPropertyDescriptor()
ab.
const p = new Proxy(
{ a: 20 },
{
getOwnPropertyDescriptor(target, prop) {
console.log(`called: ${prop}`);
return { configurable: true, enumerable: true, value: 10 };
},
},
);
console.log(Object.getOwnPropertyDescriptor(p, "a").value);
// "called: a"
// 10
Der folgende Code verletzt eine Invariante.
const obj = { a: 10 };
Object.preventExtensions(obj);
const p = new Proxy(obj, {
getOwnPropertyDescriptor(target, prop) {
return undefined;
},
});
Object.getOwnPropertyDescriptor(p, "a"); // TypeError is thrown
Spezifikationen
Specification |
---|
ECMAScript® 2025 Language Specification # sec-proxy-object-internal-methods-and-internal-slots-getownproperty-p |
Browser-Kompatibilität
Report problems with this compatibility data on GitHubdesktop | mobile | server | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
getOwnPropertyDescriptor |
Legend
Tip: you can click/tap on a cell for more information.
- Full support
- Full support