In JavaScript, Proxies are a powerful tool that enables you to intercept and
customize the fundamental operations of an object. They provide a layer of
abstraction between the target object and the code that interacts with it.
Proxies are often used for tasks like logging, validation, and data modification
before it reaches the actual object.
1. What is a Proxy?
A Proxy in JavaScript is a wrapper or placeholder for another object, called the target. The Proxy allows you to define custom behavior for fundamental operations such as property lookup, assignment, enumeration, function invocation, etc. on the target object.
2. Creating a Proxy
To create a Proxy, you use the Proxy constructor, which takes two arguments: the target object and a handler object that defines the traps for the fundamental operations.
javascript
const target = {};
const handler = {
get(target, propKey, receiver)
{
console.log(`Getting ${propKey}`);
return
Reflect.get(...arguments);
},
set(target, propKey, value,
receiver) {
console.log(`Setting ${propKey} to ${value}`);
return Reflect.set(...arguments);
}
};
const proxy = new
Proxy(target, handler);
In the above example, we have a target object {} and a handler object with get and set traps. The Proxy constructor is used to create a new proxy object proxy.
3. Proxy Traps
The handler object can define traps for various operations. Some common traps are:
get(target, propKey, receiver): Intercepts reading of a property.
set(target, propKey, value, receiver): Intercepts writing to a property.
has(target, propKey): Intercepts the in operator.
deleteProperty(target, propKey): Intercepts the delete operator.
apply(target, thisArg, argumentsList): Intercepts function calls.
construct(target, argumentsList, newTarget): Intercepts the new operator.
4. Using Proxies
Proxies can be used in various scenarios. For example, you can use them to log all property accesses on an object:
javascript
const target = {
name: 'John',
age: 30
};
const
handler = {
get(target, propKey, receiver) {
console.log(`Accessing ${propKey}`);
return Reflect.get(...arguments);
}
};
const proxy = new Proxy(target, handler);
console.log(proxy.name); // Logs: Accessing name, then John
Or, you can use Proxies to implement validation or data modification before it reaches the target object:
javascript
const handler = {
set(target, propKey, value, receiver) {
if (propKey === 'age' && typeof value !== 'number') {
throw new Error('Age must be a number');
}
return Reflect.set(...arguments);
}
};
const proxy = new Proxy(target, handler);
proxy.age = 'thirty'; // Throws an error
Proxies in JavaScript provide a powerful mechanism to intercept and customize
the behavior of objects. They are especially useful for tasks like logging,
validation, and data modification. By defining traps in the handler object, you
can intercept fundamental operations on the target object and perform custom
actions before or after the operation is executed.