A Proxy wraps an object and intercepts fundamental operations (get, set, delete, etc.) through handler traps. They enable metaprogramming patterns like validation, logging, lazy loading, and implementing reactive systems.
Proxy Basics:
new Proxy(target, handler) creates a proxytarget: The original object to wraphandler: Object with trap methodsCommon Traps:
get(target, prop, receiver): Property accessset(target, prop, value, receiver): Property assignmenthas(target, prop): 'in' operatordeleteProperty(target, prop): delete operatorapply(target, thisArg, args): Function callsconstruct(target, args): new operatorUse Cases:
const validator = {
set(target, prop, value) {
if (prop === 'age') {
if (!Number.isInteger(value)) {
throw new TypeError('Age must be an integer');
}
if (value < 0 || value > 150) {
throw new RangeError('Age must be between 0 and 150');
}
}
target[prop] = value;
return true;
}
};
const person = new Proxy({}, validator);
person.name = 'Alice'; // OK
person.age = 30; // OK
person.age = -5; // RangeError
person.age = 'thirty'; // TypeError