DEV Community

Cover image for ES6 Proxies en práctica
Gustavo Garsaky
Gustavo Garsaky

Posted on

ES6 Proxies en práctica

Con la aparición de ECMAScript 2015 (aka ES6), vino una avalancha de features; unas que ya se venían pidiendo a gritos desconsolados y desgarradores, y otros que fueron gratas sorpresillas, como cuando te encuentras a un viejo amigo mucho tiempo después.

Una de las features -del último grupo descrito- son las relacionadas a la metaprogramación. ¿Qué es eso? No ando muy elocuente hoy, así que vayamos a nuestra infalible amiga, la Wikipedia.

La metaprogramación consiste en escribir programas que escriben o manipulan otros programas (o a sí mismos) como datos, o que hacen en tiempo de compilación parte del trabajo que, de otra forma, se haría en tiempo de ejecución. Esto permite al programador ahorrar tiempo en la producción de código.

Podemos entender por metaprogramación como la capacidad de que un programa manipule otros o a sí mismos tanto en tiempo de compilación como de ejecución. Esta capacidad ha sido añadida a los lenguajes de programación prácticamente desde sus inicios y ahora también la tenemos disponible en el lenguaje bandera de la web: JavaScript.

La metaprogramación en JavaScript se basa en dos features: Proxy y Reflect API. En esta publicación trataremos el primero.

Proxy

Proxy es una nueva API que nos permite interceptar, modificar y extender objetos en tiempo de ejecución. Tan simple como eso; a través de esta API podemos realizar cosas como:

  • Profiling y logs de depuración.
  • Intercepción de llamadas a propiedades.
  • Validaciones "on the fly".

Entre otras muchas.

Proxy es un constructor que acepta dos parámetros: el objeto origen, un objeto que actúa como handler para el objeto origen. Este último contiene métodos que son conocidos como Traps.

Un Trap es un método*que modifica el comportamiento* de alguna parte del objeto. Por ejemplo, el trap get y set interceptan las llamadas a propiedades para obtener y establecer un valor respectivamente, pudiendo colocar lógica antes y durante este proceso.

Puedes ver la lista completa de traps aquí.

Para entender mejor la utilidad de los proxies, hagamos unos pequeños ejercicios.


Ejemplo: logging/profiling

Aún tenemos 17 años, estamos en la flor de nuestra adolescencia, haciendo apología al sexo, a los cigarrillos y al alcohol en plena era de aprendizaje y vivencia de nuevas experiencias. Estamos por cumplir los 18 años ya, y queremos que nuestro programa nos felicite automáticamente al cumplirlos 🎉. Para esto, podemos hacer uso de un Proxy.

No solo podemos hacer logs, como dije en un principio, podemos hacer hasta donde el lenguaje nos limite. Aquí pudimos hacer validaciones para la edad, por ejemplo, si pasa de 100 que nos arroje un error:

if (value < 13 && value > 99) {
  throw new Error('La edad debe ser entre 13 y 99')
} else {
  Reflect.set(target, property, value)
}
Enter fullscreen mode Exit fullscreen mode

Ejemplo: acceso seguro a propiedades

Ejemplo: query array

Ya vimos un ejemplo, con los traps get y set, que son los que más se usan. Para reforzar, vamos a ir un poco más allá y usaremos proxies anidados. Este ejercicio tratará de convertir un array convencional a uno queryable, para usar operadores útiles como el clásico groupBy de SQL.

Para esto, necesitaremos dos parámetros de entrada:

  • collection: array de objetos el cual extenderemos.
  • groupKeys: array de strings que representan las propiedades por las cual se va a agrupar (name, category, price, etc.)


Conclusiones

Los Proxy quizás no sea una de las más usadas features de ES6, pero es sin duda, junto con Reflect API, una de las más importantes e interesantes. Su flexibilidad nos permite adoptarla en multitud de casuísticas y lo mejor, es fácil de implementar.

Latest comments (6)

Collapse
 
sally profile image
Sally • Edited

Gracias por este articulo, no he oído mucho sobre estas características, pero creo que tienen sus usos.

Collapse
 
gugadev profile image
Gustavo Garsaky • Edited

Gracias por comentar :). Pues sí, no son características muy conocidas y usadas, pero en situaciones muy concretas, es definitivamente la mejor opción. Es muy usado cuando hablamos de metaprogramación.

PD: Your Spanish is pretty good :) where did you learn it?

Collapse
 
adam_cyclones profile image
Adam Crockett 🌀

I can't read This but it's worth mentioning, V8 has now optimized proxies so they are now viable.

Collapse
 
gugadev profile image
Gustavo Garsaky

Agreed!

Collapse
 
ianknighton profile image
Ian Knighton

¡Gracias!

Necesito practicar español.

Collapse
 
gugadev profile image
Gustavo Garsaky

And I my English haha we can learn together :P