PROXY EN JAVASCRIPT: QUÉ ES Y CÓMO UTILIZARLO
Un proxy en JavaScript es un objeto especial que actúa como intermediario para controlar el acceso a otro objeto, llamado target. Permite interceptar y personalizar operaciones como la lectura, escritura o invocación de funciones en el objeto objetivo. Se crea usando el constructor Proxy y se define mediante un target que especifica las operaciones a interceptar.Componentes
- Target: El objeto original que se quiere controlar.
- Handler: Un objeto con métodos (llamados traps) que definen el comportamiento al interactuar con el proxy. Ejemplos de traps:
- get: Intercepta la lectura de propiedades.
- set: Intercepta la asignación de valores.
- apply: Intercepta llamadas a funciones.
- has: Intercepta el operador in.
- Y otros como deleteProperty, ownKeys, etc.
Se suelen usar para:
- Validación de datos: Controlar qué valores se asignan a las propiedades.
- Logging: Registrar accesos o modificaciones a un objeto.
- Ocultar propiedades: Simular propiedades inexistentes o restringir acceso.
- Proxies para APIs: Interceptar llamadas a funciones o métodos para agregar lógica adicional.
Ejemplom de una validación:
const user = {
name: ",
age: 0
};
const validatorHandler = {
set(target, prop, value) {
if (prop === "name" && typeof value !== "string") {
throw new TypeError("El nombre debe ser una cadena");
}
if (prop === "age" && (!Number.isInteger(value) || value < 0)) {
throw new TypeError("La edad debe ser un número entero positivo");
}
target[prop] = value;
return true;
}
};
const proxyUser = new Proxy(user, validatorHandler);
proxyUser.name = "Ana"; // OK
proxyUser.age = 25; // OK
console.log(proxyUser); // { name: "Ana", age: 25 }
try {
proxyUser.name = 123; // Error: El nombre debe ser una cadena
} catch (e) {
console.error(e.message);
}
try {
proxyUser.age = -5; // Error: La edad debe ser un número entero positivo
} catch (e) {
console.error(e.message);
}
En el ejmplo el proxy intercepta asignaciones (set) y valida los datos antes de permitir la modificación. Esto es útil para garantizar la integridad de un objeto en aplicaciones críticas, como un sistema de gestión de usuarios.
- get: Intercepta la lectura de propiedades.
- set: Intercepta la asignación de valores.
- apply: Intercepta llamadas a funciones.
- has: Intercepta el operador in.
- Y otros como deleteProperty, ownKeys, etc.
const user = {
name: ",
age: 0
};
const validatorHandler = {
set(target, prop, value) {
if (prop === "name" && typeof value !== "string") {
throw new TypeError("El nombre debe ser una cadena");
}
if (prop === "age" && (!Number.isInteger(value) || value < 0)) {
throw new TypeError("La edad debe ser un número entero positivo");
}
target[prop] = value;
return true;
}
};
const proxyUser = new Proxy(user, validatorHandler);
proxyUser.name = "Ana"; // OK
proxyUser.age = 25; // OK
console.log(proxyUser); // { name: "Ana", age: 25 }
try {
proxyUser.name = 123; // Error: El nombre debe ser una cadena
} catch (e) {
console.error(e.message);
}
try {
proxyUser.age = -5; // Error: La edad debe ser un número entero positivo
} catch (e) {
console.error(e.message);
}