UNB/ CS/ David Bremner/ teaching/ cs2613/ books/ mdn/ Reference/ Global Objects/ Proxy/ Proxy/ handler.defineProperty()

The handler.defineProperty() method is a trap for the <span class="createlink">DefineOwnProperty</span> object internal method, which is used by operations such as Object.defineProperty.

Syntax

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

Parameters

The following parameters are passed to the defineProperty() method. this is bound to the handler.

Return value

The defineProperty() method must return a Boolean indicating whether or not the property has been successfully defined.

Description

Interceptions

This trap can intercept these operations:

Or any other operation that invokes the <span class="createlink">DefineOwnProperty</span> internal method.

Invariants

If the following invariants are violated, the trap throws a TypeError when invoked.

Examples

Trapping of defineProperty

The following code traps Object.defineProperty.

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"

When calling Object.defineProperty or Reflect.defineProperty, the descriptor passed to defineProperty() trap has one restriction—only following properties are usable (non-standard properties will be ignored):

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' }

Specifications

Browser compatibility

See also