Objetos Proxy de JavaScript

En este momento estás viendo Objetos Proxy de JavaScript
  • Autor de la entrada:
  • Categoría de la entrada:Javascript
  • Tiempo de lectura:6 minutos de lectura

Los objetos Proxy en Javascript sirven para interceptar las acciones que se realizan sobre un objeto. El objetivo de estos objetos es poder personalizar el comportamiento de los objetos a nuestro antojo. En este tutorial te explicaremos cómo usar los objetos Proxy en Javascript.

¿Qué es un objeto Proxy?

Un objeto Proxy es un objeto que intercepta las acciones realizadas en otro objeto, permitiendo personalizar su comportamiento. Para crear un objeto Proxy en Javascript, debes llamar a la función Proxy.

La sintaxis de la función Proxy es la siguiente:

const proxyObject = new Proxy(target, handler);

Donde:

  • target: El objeto original al que se le aplicará el comportamiento customizado.
  • handler: Un objeto con propiedades que definen cómo se personaliza el comportamiento del objeto objetivo.

Estas son algunas de las propiedades que se pueden usar en el objeto handler:

  • get: Permite personalizar el comportamiento al leer una propiedad del objeto objetivo.
  • set: Permite personalizar el comportamiento al escribir una propiedad del objeto objetivo.
  • apply: Permite personalizar el comportamiento de la llamada a una función dentro del objeto objetivo.

Ejemplo 1: Interceptando el acceso a una propiedad

Veamos un ejemplo de cómo interceptar el acceso a una propiedad de un objeto usando un objeto Proxy. En este caso, vamos a interceptar la llamada a la propiedad name y convertirla a mayúsculas.

const obj = { name: 'John' };

const handler = {
  get: function(target, prop, receiver) {
    const value = Reflect.get(target, prop, receiver);
    if (typeof value === 'string') {
      return value.toUpperCase();
    }
    return value;
  }
};

const proxyObj = new Proxy(obj, handler);

console.log(proxyObj.name); // JOHN

En este ejemplo, el objeto handler tiene una propiedad get que se ejecutará cada vez que se intente acceder a una propiedad del objeto obj. En el cuerpo de la función get, usamos la función Reflect.get para obtener el valor de la propiedad del objeto original target. Luego, si el tipo de valor es una cadena, lo convertimos a mayúsculas antes de devolverlo. Si no, devolvemos el valor original.

Ejemplo 2: Interceptando la escritura de una propiedad

Veamos ahora un ejemplo de cómo interceptar la escritura de una propiedad de un objeto usando un objeto Proxy. En este caso, vamos a interceptar la escritura de la propiedad age y lanzar una excepción si el número es menor de lo esperado.

const obj = { name: 'John', age: 18 };

const handler = {
  set: function(target, prop, value, receiver) {
    if (prop === 'edad' && value < 18) {
      throw new Error('Debes tener 18 años de edad.');
    }
    return Reflect.set(target, prop, value, receiver);
  }
};

const proxyObj = new Proxy(obj, handler);

proxyObj.edad= 15; // throws "Debes tener 18 años."

En este ejemplo, el objeto handler tiene una propiedad set que se ejecutará cada vez que se intente escribir una propiedad del objeto obj. En el cuerpo de la función set, verificamos si la propiedad que se está escribiendo es la propiedad age y si su valor es menor de 18. Si se cumple la condición, lanzamos una excepción con el mensaje «Debes tener 18 años».

Ejemplo 3: Interceptando la llamada a una función

Veamos ahora un ejemplo de cómo interceptar la llamada a una función de un objeto usando un objeto Proxy. En este caso, vamos a interceptar la llamada a la función getName y añadir el apellido del usuario a la cadena devuelta.

const obj = {
  name: 'John',
  lastName: 'Doe',
  getName: function() {
    return this.name;
  }
};

const handler = {
  apply: function(target, thisArg, args) {
    const originalResult = Reflect.apply(target, thisArg, args);
    return `${originalResult} ${thisArg.lastName}`;
  }
};

const proxyObj = new Proxy(obj, handler);

console.log(proxyObj.getName()); // John Doe

En este ejemplo, el objeto handler tiene una propiedad apply que se ejecutará cada vez que se llame a la función getName del objeto obj. En el cuerpo de la función apply, usamos la función Reflect.apply para obtener el resultado de la llamada original a la función getName del objeto obj. Luego devolvemos una cadena con el resultado original más el apellido del objeto thisArg.

Artículos Relacionados
Orlando José-Rivera
Últimas entradas de Orlando José-Rivera (ver todo)

Deja una respuesta