Buscar..
Introducción
Se puede usar un Proxy en JavaScript para modificar operaciones fundamentales en objetos. Los proxies fueron introducidos en ES6. Un Proxy en un objeto es en sí mismo un objeto que tiene trampas . Las trampas pueden activarse cuando se realizan operaciones en el Proxy. Esto incluye la búsqueda de propiedades, la función de llamada, la modificación de propiedades, la adición de propiedades, etcétera. Cuando no se define una captura aplicable, la operación se realiza en el objeto de proxy como si no hubiera un proxy.
Sintaxis
let proxied = new Proxy(target, handler);
Parámetros
Parámetro | Detalles |
---|---|
objetivo | El objeto de destino, las acciones en este objeto (obtención, configuración, etc.) se enrutarán a través del controlador |
entrenador de animales | Un objeto que puede definir "trampas" para interceptar acciones en el objeto de destino (obtención, configuración, etc.) |
Observaciones
Se puede encontrar una lista completa de "trampas" disponibles en MDN - Proxy - "Métodos del objeto controlador" .
Proxy muy simple (usando la trampa establecida)
Este proxy simplemente agrega la cadena " went through proxy"
a cada propiedad de cadena establecida en el object
destino.
let object = {};
let handler = {
set(target, prop, value){ // Note that ES6 object syntax is used
if('string' === typeof value){
target[prop] = value + " went through proxy";
}
}
};
let proxied = new Proxy(object, handler);
proxied.example = "ExampleValue";
console.log(object);
// logs: { example: "ExampleValue went trough proxy" }
// you could also access the object via proxied.target
Búsqueda de propiedades
Para influir en la búsqueda de propiedades, get
debe utilizar el controlador de get
.
En este ejemplo, modificamos la búsqueda de propiedades para que no solo se devuelva el valor, sino también el tipo de ese valor. Utilizamos Reflect para facilitar esto.
let handler = {
get(target, property) {
if (!Reflect.has(target, property)) {
return {
value: undefined,
type: 'undefined'
};
}
let value = Reflect.get(target, property);
return {
value: value,
type: typeof value
};
}
};
let proxied = new Proxy({foo: 'bar'}, handler);
console.log(proxied.foo); // logs `Object {value: "bar", type: "string"}`