Handlers For Object.X()

.defineProperty()

A trap for Object.defineProperty.


var p = new Proxy({}, {
  defineProperty: function(target, prop, descriptor) {
    Reflect.defineProperty(target, prop, descriptor);
    console.log('called: ' + prop);
    return true;
  }
});

Object.defineProperty(p, 'a', {
  configurable: true,
  enumerable: true,
  value: 10
});

console.log(Object.getOwnPropertyDescriptor(p, 'a'));

called: a {value: 10, writable: false, enumerable: true, configurable: true}

.ownKeys()

A trap for Object.keys, Object.getOwnPropertyNames and Object.getOwnPropertySymbols.


var p = new Proxy({}, {
  ownKeys: function(target) {
    console.log('called');
    return ['a', 'b', 'c'];
  }
});

console.log(Object.getOwnPropertyNames(p));

called [ 'a', 'b', 'c' ]

.getOwnPropertyDescriptor()

A trap for Object.getOwnPropertyDescriptor.


var p = new Proxy({ a: 2 }, {
  getOwnPropertyDescriptor: function(target, prop) {
    console.log('called: ' + prop);
    return {
      configurable: true,
      enumerable: true,
      value: 1
    };
  }
});

console.log(Object.getOwnPropertyDescriptor(p, 'a').value);

called: a 1

.preventExtensions()

A trap for Object.preventExtensions.


var p = new Proxy({}, {
  preventExtensions: function(target) {
    Object.preventExtensions(target);
    return true;
  }
});

p.a = 100;
console.log(Object.preventExtensions(p));

p.b = 200;
console.log(p.a, p.b);

Proxy {} 100 undefined

.isExtensible()

A trap for Object.isExtensible.


var p = new Proxy({}, {
  isExtensible: function(target) {
    console.log('called');
    return true;
  }
});

console.log(Object.isExtensible(p));

called true

.getPrototypeOf()

A trap for instanceof,Object.getPrototypeOf, Object.prototype.isPrototypeOf, and __proto__.


var obj = {};
var p = new Proxy(obj, {
  getPrototypeOf(target) {
    return Array.prototype;
  }
});

console.log(
  Object.getPrototypeOf(p) === Array.prototype,
  Reflect.getPrototypeOf(p) === Array.prototype,
  p.__proto__ === Array.prototype,
  Array.prototype.isPrototypeOf(p),
  p instanceof Array
);

true true true true true

.setPrototypeOf()

A trap for Object.setPrototypeOf.


var handler = {
  setPrototypeOf(target, newProto) {
    return false;
  }
};

var newProto = {}, target = {};
var p = new Proxy({}, handler);

Reflect.setPrototypeOf(p, newProto); // returns false
Object.setPrototypeOf(p, newProto); // throws a TypeError