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 von Operationen wie Object.getOwnPropertyDescriptor()
verwendet wird.
Probieren Sie es aus
Syntax
new Proxy(target, {
getOwnPropertyDescriptor(target, property) {
}
})
Parameter
Rückgabewert
Die Methode getOwnPropertyDescriptor()
muss ein Objekt oder undefined
zurückgeben, das den Eigenschaftsbeschreiber darstellt. Fehlende Attribute werden auf die gleiche Weise normalisiert wie bei Object.defineProperty()
.
Beschreibung
Abfangbare Operationen
Diese Trap kann folgende Operationen abfangen:
Oder jede andere Operation, die die [[GetOwnProperty]]
interne Methode aufruft.
Invarianten
Die [[GetOwnProperty]]
-interne 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 kann nicht als nicht existent gemeldet werden, wenn sie als nicht konfigurierbare 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 kann nicht als nicht existent gemeldet werden, wenn sie als eigene Eigenschaft eines nicht erweiterbaren Zielobjekts existiert. Das heißt, wenn
Reflect.isExtensible()
false
für das Zielobjekt zurückgibt, darf die Trap nichtundefined
zurückgeben. - Eine Eigenschaft kann 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()
false
für das Zielobjekt zurückgibt undReflect.getOwnPropertyDescriptor()
undefined
für die Eigenschaft auftarget
zurückgibt, muss die Trapundefined
zurückgeben. - Eine Eigenschaft kann nicht als nicht konfigurierbar gemeldet werden, es sei denn, sie existiert als nicht konfigurierbare Eigenschaft des Zielobjekts. 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 kann nicht sowohl als nicht konfigurierbar als auch als nicht beschreibbar gemeldet werden, es sei denn, sie existiert als nicht konfigurierbare, nicht beschreibbare Eigenschaft des Zielobjekts. Das heißt zusätzlich zur 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 Eigenschaftsbeschreiber der Zielobjekteigenschaft mit
descriptor
kompatibel sein. Das heißt, wenn mantarget
als normales Objekt betrachtet, dann darfObject.defineProperty(target, property, resultObject)
keinen Fehler werfen. Der Verweis aufObject.defineProperty()
enthält mehr Informationen, aber zusammengefasst, wenn die Zielobjekteigenschaft nicht konfigurierbar ist, muss Folgendes zutreffen:configurable
,enumerable
,get
undset
müssen die gleichen wie die Originale sein.writable
muss ebenfalls original sein aufgrund der vorherigen Invariante.- Die Eigenschaft muss als Daten- oder Zugriffseigenschaft bleiben
- Das
value
-Attribut 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 Language Specification # sec-proxy-object-internal-methods-and-internal-slots-getownproperty-p |
Browser-Kompatibilität
BCD tables only load in the browser