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