Рубрики
Без рубрики

JavaScript Proxies: случаи использования реального мира

В условиях программирования прокси – любая организация, которая действует от имени какой-то другой организации. Прокси-сервер находится между …

Автор оригинала: Arbaz Siddiqui.

Ссылка на сайт к оригинальной статье.

Введение в прокси

В условиях программирования прокси – любая организация, которая действует от имени какой-то другой организации. Прокси-сервер расположен между клиентом и сервером и действует клиент для сервера и наоборот. Работа любого прокси – перехватить входящие запросы/вызовы и пересылать его вверх по течению. Этот перехват позволяет прокси добавить логику и изменять поведение входящих и исходящих запросов.

Прокси JavaScript – это нечто очень похожее, что между вашим фактическим объектом и кодом пытается получить доступ к этому объекту.

Согласно веб-документам MDN:

Прокси-объект используется для определения пользовательского поведения для фундаментальных операций (например, поиск свойств, назначение, перечисление, вызов функций и т. Д.).

Терминологии

Есть три термина, которые нам нужно знать, прежде чем мы сможем реализовать прокси:

Цель

Цель – это фактический объект, который наш прокси будет сидеть перед и виртуализировать. Это может быть любой объект JavaScript.

Ловушки

Ловушки – это методы, которые перехватывают вызов цели, когда вызывается свойство или метод. Есть Многие Определенные ловушки, которые могут быть реализованы.

Обработчик

Обработчик – это объект заполнителя, где живут все ловушки. Вы можете подумать об этом как об этом как объект с ключами ломтиков и значений функций, реализующих эти ловушки.

Давайте посмотрим на основной пример:

//movie is a target
const movie = {
  name: "Pulp Fiction",
  director: "Quentin Tarantino"
};

//this is a handler
const handler = {
  //get is a trap
  get: (target, prop) => {
    if (prop === 'director') {
      return 'God'
    }
    return target[prop]
  },

  set: function (target, prop, value) {
    if (prop === 'actor') {
      target[prop] = 'John Travolta'
    } else {
      target[prop] = value
    }
  }
};

const movieProxy = new Proxy(movie, handler);

console.log(movieProxy.director); //God

movieProxy.actor = "Tim Roth";
movieProxy.actress = "Uma Thurman";

console.log(movieProxy.actor); //John Travolta
console.log(movieProxy.actress); //Uma Thurman

Выход выше выполнения кода будет:

God
John Travolta
Uma Thurman

В приведенном выше примере наш целевой объект был фильм Мы реализовали обработчик с получить и а Установить ловушка. Мы добавили логику, что если мы доступны Режиссер Ключ, мы должны вернуть строку Бог вместо фактического значения. Точно так же мы добавили Установить Ловушка, которая перехватит все записи для целевого объекта и изменить значение для Джон Траволта Если ключ Актер Отказ

## Реальные случаи использования мира

Возможности бесконечны

Хотя он не так хорошо известен как другие функции ES2015, Proxy имеет много немногодных, таких как значения по умолчанию для всех свойств цели, могут быть очевидны сейчас. Позволяет взглянуть на более реальные сценарии мира, где мы можем использовать прокси.

Валидация

Поскольку мы можем перехватить писать на объект, мы можем сделать проверку значение, которое мы пытаемся установить на объекте. Позволяет привести пример:

const handler = {
  set: function (target, prop, value) {
    const houses = ['Stark', 'Lannister'];
    if (prop === 'house' && !(houses.includes(value))) {
      throw new Error(`House ${value} does not belong to allowed ${houses}`)
    }
    target[prop] = value
  }
};

const gotCharacter = new Proxy({}, handler);

gotCharacter.name = "Jamie";
gotCharacter.house = "Lannister";

console.log(gotCharacter);

gotCharacter.name = "Oberyn";
gotCharacter.house = "Martell";

Выполнение вышеуказанного кода приведет к следующему выходу:

{ name: 'Jamie', house: 'Lannister' }
Error: House Martell does not belong to allowed Stark,Lannister

В приведенном выше примере мы ограничиваем, что значение, разрешенное для свойства Дом Может быть только один из разрешенных домов. Мы даже можем использовать этот подход для создания объектов только для чтения, все, что нам нужно сделать этот бросок внутри Установить ловушка.

Побочные эффекты

Мы можем использовать прокси, чтобы создать побочные эффекты на недвижимость для чтения/записи. Идея состоит в том, чтобы вызвать некоторую функцию, если конкретное свойство доступно или записано. Позволяет привести пример:

const sendEmail = () => {
  console.log("sending email after task completion")
};


const handler = {
  set: function (target, prop, value) {
    if (prop === 'status' && value === 'complete') {
      sendEmail()
    }
    target[prop] = value
  }
};

const tasks = new Proxy({}, handler);

tasks.status = "complete";

Выполнение вышеуказанного кода приведет к следующему выходу:

sending email after task completion

Здесь мы перехватываем пишет в недвижимость Статус И если Статус Завершено, мы запускаем функцию побочного эффекта. Один действительно прохладный реализация это в Sindre Sorhus ‘s по изменению упаковка.

Кэширование

Как мы можем перехватить доступ к свойствам объекта, мы можем построить кэширования памяти, чтобы только возвращать значения для объекта, если он не имеет истечения. Давайте посмотрим на пример:

const cacheTarget = (target, ttl = 60) => {
  const CREATED_AT = Date.now();
  const isExpired = () => (Date.now() - CREATED_AT) > (ttl * 1000);
  const handler = {
    get: (target, prop) => isExpired() ? undefined : target[prop]
  };
  return new Proxy(target, handler)
};

const cache = cacheTarget({age: 25}, 5);

console.log(cache.age);

setTimeout(() => {
  console.log(cache.age)
}, 6 * 1000);

Выполнение вышеуказанного кода приведет к следующему выходу:

25
undefined

Здесь мы создаем функцию, которая возвращает прокси и обработчик для этого прокси сначала проверки, если объект истек или нет. Мы можем продлить эту функциональность иметь на основе ключевых TTLS и многое другое.

Недостатки

В то время как прокси – довольно волшебные, но там мало недостатков с прокси, которые мы должны быть осторожны.

  1. Производительность может взять Резкий Нажмите при использовании прокси и, следовательно, следует избегать при написании критического кода производительности.
  2. Учитывая объект не знание, если это прокси-объект или целевой объект.
  3. Наконец, прокси не обязательно приводит к очень чистому и легко понятному коду.

Заключение

Прокси невероятно мощные и могут быть использованы и оскорблены для широкого спектра вещей. В этой статье мы посмотрели, какие прокси, как их реализовать, мало реального мира используют случаи их и их недостатков.

Как этот пост? Вы можете найти больше в Twitter: @Arbazsiddiqui_ Или посетить мой Сайт Или присоединиться к рассылка Спасибо за прочтение!