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 handler.getOwnPropertyDescriptor()-Methode ist eine Trap für die [[GetOwnProperty]] objektinternen Methode, die von Operationen wie Object.getOwnPropertyDescriptor() verwendet wird.

Probieren Sie es aus

const monster = {
  eyeCount: 4,
};

const handler = {
  getOwnPropertyDescriptor(target, prop) {
    console.log(`called: ${prop}`);
    // Expected output: "called: eyeCount"

    return { configurable: true, enumerable: true, value: 5 };
  },
};

const proxy = new Proxy(monster, handler);

console.log(Object.getOwnPropertyDescriptor(proxy, "eyeCount").value);
// Expected output: 5

Syntax

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

Parameter

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

target

Das Zielobjekt.

property

Ein String oder ein Symbol, das den Eigenschaftsnamen darstellt.

Rückgabewert

Die getOwnPropertyDescriptor()-Methode muss ein Objekt oder undefined zurückgeben, das den Eigenschaftsdescriptor darstellt. Fehlende Attribute werden auf die gleiche Weise normalisiert wie bei Object.defineProperty().

Beschreibung

Abfangvorgänge

Diese Trap kann folgende Vorgänge 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 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 Trap 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 Trap 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 Trap 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 Trap nicht configurable: false zurückgeben.
  • Eine Eigenschaft kann nicht 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 Trap nicht configurable: false, writable: false zurückgeben.
  • Wenn eine Eigenschaft eine entsprechende Eigenschaft auf dem Zielobjekt hat, muss der Descriptor der Zielobjekteigenschaft mit descriptor kompatibel sein. Das heißt, angenommen, target ist ein gewöhnliches Objekt, dann darf Object.defineProperty(target, property, resultObject) keinen Fehler auslösen. Die Referenz von Object.defineProperty() enthält mehr Informationen, aber zusammengefasst, wenn die Zieleigenschaft nicht konfigurierbar ist, muss Folgendes gelten:
    • configurable, enumerable, get und set müssen wie im Original sein. writable muss auch aufgrund der vorherigen Invariante das Original sein.
    • die Eigenschaft muss als Daten- oder Accessor-Eigenschaft bleiben
    • das value-Attribut kann 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