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 Falle für die [[GetOwnProperty]]-interne Objekte-Methode, die von 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

js
new Proxy(target, {
  getOwnPropertyDescriptor(target, property) {
  }
})

Parameter

Die folgenden Parameter werden an die Methode getOwnPropertyDescriptor() übergeben. this ist an den Handler gebunden.

target

Das Zielobjekt.

property

Ein String oder ein Symbol, das den Eigenschaftsnamen darstellt.

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 Object.defineProperty().

Beschreibung

Abfangmethoden

Diese Falle kann die folgenden Operationen abfangen:

Oder jede andere Operation, die die [[GetOwnProperty]]-interne Methode aufruft.

Invarianten

Die [[GetOwnProperty]]-interne Methode des Proxys löst einen TypeError aus, wenn die Handler-Definition eine der folgenden Invarianten verletzt:

  • Das Ergebnis muss entweder ein Object oder undefined sein.
  • Eine Eigenschaft kann 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 auf target zurückgibt, darf die Falle nicht undefined 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 Falle nicht undefined 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 und Reflect.getOwnPropertyDescriptor() undefined für die Eigenschaft auf target zurückgibt, muss die Falle undefined zurückgeben.
  • Eine Eigenschaft kann nicht als nicht konfigurierbar gemeldet werden, es sei denn, sie existiert als nicht konfigurierbare eigene Eigenschaft des Zielobjekts. Das heißt, wenn Reflect.getOwnPropertyDescriptor() undefined oder configurable: true für die Eigenschaft auf target zurückgibt, darf die Falle nicht configurable: false zurückgeben.
  • Eine Eigenschaft kann nicht gleichzeitig als nicht konfigurierbar und nicht beschreibbar gemeldet werden, es sei denn, sie existiert als nicht konfigurierbare, nicht beschreibbare eigene Eigenschaft des Zielobjekts. Das heißt, zusätzlich zur vorherigen Invariante, wenn Reflect.getOwnPropertyDescriptor() configurable: false, writable: true für die Eigenschaft auf target zurückgibt, darf die Falle nicht configurable: false, writable: false zurückgeben.
  • Wenn eine Eigenschaft eine entsprechende Eigenschaft auf dem Zielobjekt hat, muss der Deskriptor der Zielobjekteigenschaft mit descriptor kompatibel sein. Das heißt, vorausgesetzt target ist ein gewöhnliches Objekt, dann darf Object.defineProperty(target, property, resultObject) keinen Fehler werfen. Die Referenz Object.defineProperty() enthält mehr Informationen, aber zusammengefasst muss gelten:
    • configurable, enumerable, get, und set müssen identisch mit dem Original sein. writable muss ebenfalls aufgrund der vorherigen Invariante das Original sein.
    • Die Eigenschaft muss als Daten- oder Zugreifereigenschaft bleiben.
    • Das value-Attribut darf nur geändert werden, wenn writable true ist.

Beispiele

Abfangen von getOwnPropertyDescriptor

Der folgende Code fängt Object.getOwnPropertyDescriptor() ab.

js
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.

js
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® 2026 Language Specification
# sec-proxy-object-internal-methods-and-internal-slots-getownproperty-p

Browser-Kompatibilität

Siehe auch