Challenge - Validation with Proxy
Build a wrapper that validates a settings object's properties with Proxy and Reflect.
Validation with Proxy
In this challenge you will build a validation wrapper that protects a settings object. new Proxy(target, handler) gives indirect access to a target; the traps in handler intercept each operation.
The set trap runs when a property is assigned. Its signature is (target, key, value, receiver). For an invalid value you throw; for a valid one you call Reflect.set(target, key, value, receiver) and return the true it yields.
Reflect mirrors the Proxy trap signatures so you can reproduce the default behavior easily.
Exercise Write a validating Proxy
Write a handler object whose set trap has the signature (target, key, value, receiver). If value is not a number, throw new TypeError('number required'). For valid values call Reflect.set(target, key, value, receiver) and return its result. Finally wrap a settings object with new Proxy(settings, handler).
Show example solution
Write const handler = { set(target, key, value, receiver) { if (typeof value !== 'number') throw new TypeError('number required'); return Reflect.set(target, key, value, receiver); } };. Then wrap with const proxy = new Proxy(settings, handler);.
Example solution:
const handler = {
set(target, key, value, receiver) {
if (typeof value !== 'number') throw new TypeError('number required');
return Reflect.set(target, key, value, receiver);
}
};
const settings = {};
const proxy = new Proxy(settings, handler);
Test yourself
-
What does Reflect.set return?
const ok = Reflect.set(target, key, value, receiver);- The assigned value
- The target object
- A success boolean
- Nothing (undefined)
Show answer
A success boolean — Correct! Reflect.set returns true on success and false on failure; you pass it back from the trap.
-
Complete the set trap signature
const handler = { set(target, key, value, ____) { if (typeof value !== 'number') throw new TypeError('number required'); return Reflect.set(target, key, value, receiver); } };Show answer
const handler = { set(target, key, value, receiver) { if (typeof value !== 'number') throw new TypeError('number required'); return Reflect.set(target, key, value, receiver); } }; -
Match the Proxy concepts
- new Proxy(t, h)
- Create wrapper
- set trap
- Catch assignment
- Reflect.set
- Default assign
- throw
- Invalid value