Ir al contenido
angel.library

Proxy

A veces el comportamiento extra que necesitas no es “antes o después de llamar a una función” (eso es Decorator) sino “cada vez que se lee o escribe una propiedad de un objeto”. JavaScript tiene soporte nativo para esto: Proxy.

lib/config-proxy.ts
const configReal = {
apiUrl: "https://api.miapp.com",
featureFlagX: true,
secretoInterno: "..."
}
export const config = new Proxy(configReal, {
get(target, prop: string) {
console.log(`[config] se leyó la clave "${prop}"`)
return target[prop as keyof typeof target]
}
})
config.apiUrl // dispara el log, devuelve el valor real

Útil para detectar qué claves de configuración se usan de verdad antes de eliminar las que no.

lib/memoize-proxy.ts
function memoize<T extends (...args: any[]) => any>(fn: T): T {
const cache = new Map<string, ReturnType<T>>()
return new Proxy(fn, {
apply(target, thisArg, args) {
const key = JSON.stringify(args)
if (cache.has(key)) return cache.get(key)
const resultado = Reflect.apply(target, thisArg, args)
cache.set(key, resultado)
return resultado
}
}) as T
}
const buscarUsuarioCacheado = memoize(buscarUsuarioEnDB)

buscarUsuarioCacheado(id) se llama exactamente igual que la función original — el proxy intercepta la llamada y decide si ejecuta la función real o devuelve el valor cacheado.

Proxy tiene un costo de rendimiento en rutas críticas —cada acceso pasa por la trampa— y hace la depuración menos directa: el objeto observado no es el original, sino el intermediario. Para casos simples, como envolver una función conocida para aplicar caché o registros, una función envolvente explícita (function withCache(fn) { ... }, sin Proxy) suele ser más legible. Reserva Proxy para interceptar acceso a propiedades dinámicas que no se conocen de antemano.