Inicio Noticias JavaScript Jems: el proxy

JavaScript Jems: el proxy

Índice de artículos JavaScript Jems – Proxy Proxy Traps

Página 1 de 2

El proxy es un objeto misterioso que se esconde detrás de otros objetos: la pregunta es ¿por qué? Este es un extracto de mi libro recientemente publicado, JavaScript Jems: The Amazing Parts.

Ahora disponible como libro en su Amazon local.

Jem JavaScript:
Las partes asombrosas

Contenido

Jem 0 Por qué JavaScript es un Jem Jem 1 JavaScript no tiene clases Jem 2 El impuesto a la herencia Jem 3 Las funciones son objetos Jem 4 Objetos, funciones y este Jem 5 Cada objeto es un singleton anónimo Jem 6 Los objetos tienen valor Jem 7 Números y otros valores Jem 8 Verdad y Falsey Jem 9 La coma Jem 10 Código como datos Jem 11 Expresiones lambda Jem 12 Interfaces fluidas Jem 13 Elevación, alcance y duración Jem 14 Increíble Async Jem 15 El modelo de detector del fabricante Jem 16 Funcional y no lo suficientemente funcional Jem 17 Inmutabilidad Jem 18 Enfoque de iteración funcional
Extraer 1 iteración funcional
Metaprogramación Jem 19 – El proxy
Extraer 1 el proxy

Metaprogramación Jem 19 – El proxy

“Un estado de cosas hermoso cuando un hombre tiene que satisfacer sus vicios por poder”.

Raymond Chandler

La metaprogramación se define estrictamente como el lugar donde el código puede tratarse como datos. JavaScript es natural en la metaprogramación porque puede tratar todo el código como datos, aunque esto generalmente está mal visto porque tiene muchos peligros potenciales; consulte Jem 10: Code as Data. Además de tratar el código como datos, la metaprogramación también tiende a significar hacer cosas que cambian la forma en que funciona el lenguaje, y probablemente lo haga el nuevo objeto proxy introducido en ES2015.

Como quiera llamarlo, el objeto Proxy aporta algunas funciones muy necesarias a JavaScript, lo que lo convierte en una joya por derecho propio.

El objeto proxy

Entonces, ¿qué es un proxy? En pocas palabras, un proxy es algo que reemplaza a otra cosa. En este caso, puede definir un proxy para cualquier objeto JavaScript y puede seleccionar qué tipo de cosas reemplazará.

Cree un objeto Proxy de la forma habitual:

const myProxy = nuevo Proxy (destino, controlador);

donde target es el objeto que el nuevo objeto sustituirá. El segundo parámetro es un objeto que define las acciones de las que se encargará el proxy y las funciones que definen lo que sucede. Todas las acciones que no están definidas en el administrador se pasan al destino.

Puede pensar que el Proxy envuelve el objeto de destino y recibe una variedad de solicitudes que normalmente se manejarían automáticamente y le permiten personalizarlas. Por ejemplo, puede usar la función get handler para interceptar cualquier recuperación de propiedad. Es decir, se llama a la función get siempre que se lee una propiedad del objeto de destino y puede devolver un valor para la propiedad independientemente de lo que esté realmente almacenado en la propiedad de destino o incluso si el destino tiene la propiedad:

let myObject = {myProperty: 0}; const handler = {get: function (target, prop, receptor) {return 42; }}; myObject = new Proxy (myObject, administrador);

Los parámetros de la función get proporcionan el objeto de destino, el nombre de la propiedad y el destinatario de la solicitud, generalmente el objeto Proxy en sí. En este ejemplo, puede ver que la función get devuelve 42, independientemente del nombre de la propiedad.

Entonces, si intentas:

console.log (myObject.myProperty); console.log (myObject.noProperty);

verá 42 mostrados para ambas propiedades, aunque la primera está establecida en 0 y la segunda no existe realmente.

En este caso, hemos envuelto el objeto original en un proxy y hemos perdido la referencia a él. Esto significa que solo podemos acceder al objeto a través del proxy. Sin embargo, si hubiéramos mantenido una referencia al objeto original:

myObject2 = new Proxy (myObject, administrador);

luego, el uso de myObject2 pasaría por el proxy y myObject usaría las propiedades del objeto original sin la interferencia del proxy. Es decir, las referencias al proxy se interceptan, pero no las referencias al objeto original. También puede revocar un objeto Proxy y, después de una revocación, solo puede acceder al objeto original.

Tenga en cuenta que esto es realmente metaprogramación porque está cambiando la forma predeterminada en que se accede a una propiedad.

Una forma alternativa de crear un objeto envuelto por un proxy es envolver un objeto nulo y luego agregar propiedades:

const myObject = nuevo proxy ({}, administrador); myObject.myProperty = 0;

Este es un buen enfoque para usar en un constructor o una fábrica de objetos.

Los objetos proxy también funcionan dentro de la cadena de prototipos, por ejemplo:

const handler = {get: function (target, prop, receptor) {return 42; }}; let myProxy = new Proxy ({}, controlador); const myObject = Object.create (myProxy,
{myProperty: {value: 0}});
console.log (myObject.myProperty); console.log (myObject.noProperty);

En este caso creamos un proxy envolviendo un objeto nulo y luego creamos myObject con el proxy como su prototipo. Ahora todas las propiedades definidas en myObject son propiedades propias y funcionan normalmente, es decir, myProxy no intercepta ningún uso de ellas, pero las propiedades que no son propiedades propias se buscan en la cadena del prototipo y se llama a myProxy. Como resultado, se muestra 0 para myProperty y 42 para noProperty. En este caso, el parámetro del receptor se establece para hacer referencia a myObject en lugar del objeto nulo envuelto.

También puede envolver objetos incrustados con un proxy y esto es muy poderoso.

Trampas de proxy

Se recuperan y configuran dos de los controladores de proxy más fáciles de entender, o trampas como los llama la documentación. Usamos get como nuestro primer ejemplo de uso de un proxy en la sección anterior, y set funciona de la misma manera, pero detecta cualquier intento de almacenar algo en una propiedad:

obtener: función (objetivo, prop, receptor) conjunto: función (objetivo, prop, valor, receptor)

Tenga en cuenta que ambas funciones tienen el nombre de propiedad, prop y set también tienen el valor almacenado. La función set también debe devolver verdadero si el valor está escrito correctamente y falso en caso contrario. También tenga en cuenta que, a diferencia de los accesos get y set simples, los accesos de intercepción get y set de proxy a todas las propiedades. Esto significa que puede usar get y set para realizar diferentes operaciones para cada propiedad: tareas como validar, desinfectar y formatear datos. Simplemente use Proxy get and set si necesita cambiar la forma en que un conjunto o todas las propiedades de un objeto deben comportarse, que es un enfoque central para procesar todas las propiedades.

Entonces, ¿qué tipo de cosas necesita para obtener y configurar Proxy?

Marc Gomez
Vine a por tabaco y ya me quedé aquí. Cuando no estoy en el sótano de Tecnopasion suelo pasear por las calles de Barcelona.
RELATED ARTICLES

Dejar respuesta

Please enter your comment!
Please enter your name here