construct
Ловушка construct(target, argumentsList) перехватывает вызовы при помощи new . Она получает исходный объект target и список аргументов argumentsList .
Пример ниже передаёт операцию создания исходному классу или функции‑конструктору, выводя сообщение об этом:
'use strict';
function User(name, surname) { this.name = name; this.surname = surname;
}
let UserProxy = new Proxy(User, {
// передаст вызов new User, предварительно сообщив о нём construct: function(target, argumentsList) {
alert(`Запуск new с аргументами: ${argumentsList}`); return new target(...argumentsList);
}
});
let user = new UserProxy("Ilya", "Kantor"); alert( user.name ); // Ilya
Полный список
Полный список возможных функций‑перехватчиков, которые может задавать handler :
getPrototypeOf – перехватывает обращение к методу getPrototypeOf .
setPrototypeOf – перехватывает обращение к методу setPrototypeOf .
isExtensible – перехватывает обращение к методу isExtensible .
preventExtensions – перехватывает обращение к методу preventExtensions .
getOwnPropertyDescriptor – перехватывает обращение к методу getOwnPropertyDescriptor .
defineProperty – перехватывает обращение к методу defineProperty .
has – перехватывает проверку существования свойства, которая используется в операторе in и в некоторых других методах встроенных объектов.
get – перехватывает чтение свойства.
set – перехватывает запись свойства.
deleteProperty – перехватывает удаление свойства оператором delete .
enumerate – срабатывает при вызове for..in или for..of , возвращает итератор для свойств объекта.
ownKeys – перехватывает обращения к методу getOwnPropertyNames .
apply – перехватывает вызовы target() .
construct – перехватывает вызовы new target() .
Каждый перехватчик запускается с handler в качестве this . Это означает, что handler кроме ловушек может содержать и другие полезные свойства и методы.
Каждый перехватчик получает в аргументах target и дополнительные параметры в зависимости от типа. Если перехватчик в handler не указан, то операция совершается, как если бы была вызвана прямо на target .
Итого
Proxy позволяет модифицировать поведение объекта как угодно, перехватывать любые обращения к его свойствам и методам, включая вызовы для функций.
Особенно приятна возможность перехватывать обращения к отсутствующим свойствам, разработчики ожидали её уже давно.
Что касается поддержки, то возможности полифиллов здесь ограничены. «Переписать» прокси на старом JavaScript сложновато, учитывая низкоуровневые возможности, которые он даёт.
Поэтому нужна именно браузерная поддержка. Постепенно она реализуется.
Do'stlaringiz bilan baham: |