главная/JavaScript объект Proxy. ES6
javascript Proxy

JavaScript объект Proxy. ES6

Объект Proxy в JavaScript — это относительно новое дополнение к языку, которое было представлено в ES6.

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

Объект Proxy определяется следующим образом:

const proxy = new Proxy(target, handler);

Цель (target) — это объект, вокруг которого создается прокси, в то время как обработчик (handler) — это объект, который содержит одну или несколько «ловушек» — функций, которые перехватывают операции, выполняемые над целевым объектом.

Существует множество доступных ловушек, которые можно использовать для настройки поведения целевого объекта.

Вот краткий обзор всех доступных ловушек и их функций:

  • get(target, prop, receiver) — Перехватывает вызовы target[prop]
  • set(target, prop, value, receiver) — Перехватывает вызовы target[prop] = value
  • has(target, prop) — Перехватывает вызовы prop in target
  • apply(target, thisArg, argumentsList) — Перехватывает вызовы функций
  • construct(target, argumentsList, newTarget) — Перехватывает вызовы оператора new
  • defineProperty(target, prop, descriptor) — Перехватывает вызовы Object.defineProperty()
  • deleteProperty(target, prop) — Перехватывает вызовы delete target[prop]
  • getOwnPropertyDescriptor(target, prop) — Перехватывает вызовы Object.getOwnPropertyDescriptor()
  • ownKeys(target) — Перехватывает вызовы Object.getOwnPropertyNames() и Object.getOwnPropertySymbols()
  • getPrototypeOf(target) — Перехватывает вызовы Object.getPrototypeOf()
  • setPrototypeOf(target, prototype) — Перехватывает вызовы Object.setPrototypeOf()
  • isExtensible(target) — Перехватывает вызовы Object.isExtensible()
  • preventExtensions(target) — Перехватывает вызовы Object.preventExtensions()

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

Вот простой пример, который перехватывает вызов get и возвращает null, если свойство не существует в целевом объекте:

const targetObj = { name: 'Sam', age: 20 };

const handler = {
get(target, property) {
return property in target ? target[property] : null;
}
};

const proxyObj = new Proxy(targetObj, handler);

proxyObj.name; // 'Sam'
proxyObj.age; // 20
proxyObj.address; // null