MENU
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