The handler.set() method is a trap for the [[Set]] object internal method, which is used by operations such as using property accessors to set a property's value.
const monster = { eyeCount: 4 };
const handler = {
set(obj, prop, value) {
if (prop === "eyeCount" && value % 2 !== 0) {
console.log("Monsters must have an even number of eyes");
} else {
return Reflect.set(...arguments);
}
},
};
const proxy = new Proxy(monster, handler);
proxy.eyeCount = 1;
// Expected output: "Monsters must have an even number of eyes"
console.log(proxy.eyeCount);
// Expected output: 4
proxy.eyeCount = 2;
console.log(proxy.eyeCount);
// Expected output: 2new Proxy(target, {
set(target, property, value, receiver) {
}
})The following parameters are passed to the set() method. this is bound to the handler.
targetThe target object.
propertyA string or Symbol representing the property name.
valueThe new value of the property to set.
receiverThe this value for setters; see Reflect.set(). This is usually either the proxy itself or an object that inherits from the proxy.
The set() method must return a Boolean indicating whether or not the assignment succeeded. Other values are coerced to booleans.
Many operations, including using property accessors in strict mode, throw a TypeError if the [[Set]] internal method returns false.
This trap can intercept these operations:
proxy[foo] = bar and proxy.foo = barReflect.set()Or any other operation that invokes the [[Set]] internal method.
The proxy's [[Set]] internal method throws a TypeError if the handler definition violates one of the following invariants:
Reflect.getOwnPropertyDescriptor() returns configurable: false, writable: false for the property on target, and value is different from the value attribute in the target's property descriptor, then the trap must return a falsy value.Reflect.getOwnPropertyDescriptor() returns configurable: false, set: undefined for the property on target, then the trap must return a falsy value.The following code traps setting a property value.
const p = new Proxy(
{},
{
set(target, prop, value, receiver) {
target[prop] = value;
console.log(`property set: ${prop} = ${value}`);
return true;
},
},
);
console.log("a" in p); // false
p.a = 10; // "property set: a = 10"
console.log("a" in p); // true
console.log(p.a); // 10