handler.defineProperty()

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

Probieren Sie es aus

Syntax

js
new Proxy(target, {
  defineProperty(target, property, descriptor) {
  }
})

Parameter

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

target

Das Zielobjekt.

property

Ein String oder Symbol, das den Eigenschaftsnamen repräsentiert.

descriptor

Der Deskriptor für die Eigenschaft, die definiert oder modifiziert wird.

Rückgabewert

Die Methode defineProperty() muss einen Boolean zurückgeben, der angibt, ob die Eigenschaft erfolgreich definiert wurde oder nicht. Andere Werte werden in Booleans umgewandelt.

Viele Operationen, einschließlich Object.defineProperty() und Object.defineProperties(), werfen einen TypeError, wenn die interne Methode [[DefineOwnProperty]] false zurückgibt.

Beschreibung

Abfangvorgänge

Diese Trap kann folgende Operationen abfangen:

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

Invarianten

Die [[DefineOwnProperty]]-Methode des Proxys wirft einen TypeError, wenn die Handlerdefinition eine der folgenden Invarianten verletzt:

  • Eine Eigenschaft kann nicht hinzugefügt werden, wenn das Zielobjekt nicht erweiterbar ist. Das heißt, wenn Reflect.isExtensible() auf target false zurückgibt und Reflect.getOwnPropertyDescriptor() für die Eigenschaft auf target undefined zurückgibt, muss die Trap einen falschen Wert zurückgeben.
  • Eine Eigenschaft kann nicht nicht-konfigurierbar sein, es sei denn, es gibt eine entsprechende nicht-konfigurierbare eigene Eigenschaft des Zielobjekts. Das heißt, wenn Reflect.getOwnPropertyDescriptor() undefined oder configurable: true für die Eigenschaft auf target zurückgibt und descriptor.configurable false ist, muss die Trap einen falschen Wert zurückgeben.
  • Eine nicht-konfigurierbare Eigenschaft kann nicht nicht-schreibbar sein, es sei denn, es gibt eine entsprechende nicht-konfigurierbare, nicht-schreibbare eigene Eigenschaft des Zielobjekts. Das heißt, wenn Reflect.getOwnPropertyDescriptor() configurable: false, writable: true für die Eigenschaft auf target zurückgibt und descriptor.writable false ist, muss die Trap einen falschen Wert zurückgeben.
  • Wenn eine Eigenschaft eine entsprechende Eigenschaft auf dem Zielobjekt hat, muss der Deskriptor der Zielobjekteigenschaft mit descriptor kompatibel sein. Das heißt, wenn target ein gewöhnliches Objekt wäre und Object.defineProperty(target, property, descriptor) einen Fehler werfen würde, muss die Trap einen falschen Wert zurückgeben. Die Referenz Object.defineProperty() enthält mehr Informationen, aber zusammenfassend muss, wenn die Zieleigenschaft nicht konfigurierbar ist, Folgendes gelten:
    • configurable, enumerable, get und set können nicht geändert werden
    • die Eigenschaft kann nicht zwischen Daten- und Accessor-Eigenschaft gewechselt werden
    • das writable-Attribut kann nur von true zu false geändert werden
    • das value-Attribut kann nur geändert werden, wenn writable true ist

Beispiele

Abfangen von defineProperty

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

js
const p = new Proxy(
  {},
  {
    defineProperty(target, prop, descriptor) {
      console.log(`called: ${prop}`);
      return true;
    },
  },
);

const desc = { configurable: true, enumerable: true, value: 10 };
Object.defineProperty(p, "a", desc); // "called: a"

Beim Aufruf von Object.defineProperty() oder Reflect.defineProperty() hat der an die defineProperty()-Trap übergebene descriptor eine Einschränkung—es sind nur die folgenden Eigenschaften nutzbar (nicht-standardisierte Eigenschaften werden ignoriert):

  • enumerable
  • configurable
  • writable
  • value
  • get
  • set
js
const p = new Proxy(
  {},
  {
    defineProperty(target, prop, descriptor) {
      console.log(descriptor);
      return Reflect.defineProperty(target, prop, descriptor);
    },
  },
);

Object.defineProperty(p, "name", {
  value: "proxy",
  type: "custom",
}); // { value: 'proxy' }

Spezifikationen

Specification
ECMAScript Language Specification
# sec-proxy-object-internal-methods-and-internal-slots-defineownproperty-p-desc

Browser-Kompatibilität

BCD tables only load in the browser

Siehe auch