Proxy.revocable()
Baseline Widely available
This feature is well established and works across many devices and browser versions. It’s been available across browsers since September 2016.
Статический метод Proxy.revocable()
создаёт подлежащий отзыву объект Proxy
.
Синтаксис
Proxy.revocable(target, handler)
Параметры
Возвращаемое значение
Обычный объект с двумя свойствами:
proxy
-
Прокси объект, идентичный создаваемому с помощью вызова
new Proxy(target, handler)
. revoke
-
Функция без параметров для отзыва (выключения)
proxy
.
Описание
Фабричная функция Proxy.revocable()
это то же самое, что конструктор Proxy()
, но в дополнение к созданию прокси объекта она создаёт функцию revoke
, которая может быть вызвана для отмены прокси. Прокси объект и функция revoke
оборачиваются в обычный объект.
Функция revoke
не принимает параметров и не зависит от значения this
. Созданный объект proxy
прикрепляется к функции revoke
в виде приватного свойства, к которому функция revoke
обращается при вызове (приватное свойство незаметно извне, но оно влияет на то, как происходит сбор мусора). Объект proxy
не попадает в замыкание функции revoke
(что делает сбор мусора proxy
невозможным если revoke
ещё существует).
После вызова функции revoke()
прокси становится непригодным для использования: любое обращени к обработчику вызовет TypeError
. Прокси, будучи однажды отозван, остаётся отозванным, и повторный вызов revoke()
не имеет эффекта — фактически вызов revoke()
отделяет объект proxy
от функции revoke
, и у неё больше нет доступа к объекту. Если на прокси больше нет ссылок, то он становится доступным для сбора мусора. Функция revoke
также отделяет target
и handler
от proxy
, поэтому если на target
нет ссылок, то он тоже становится доступным для сбора мусора (даже если прокси ещё существует), поскольку больше нет явного способа взаимодействия с целевым объектом.
Предоставление пользователям возможность взаимодействовать с объектом через подлежащий отзыву прокси позволяет контролировать время жизни объекта доступного пользователю. Вы можете сделать объект пригодным для сбора мусора, даже если пользователь все ещё хранит ссылку на его прокси.
Примеры
Использование Proxy.revocable()
const revocable = Proxy.revocable(
{},
{
get(target, name) {
return `[[${name}]]`;
},
},
);
const proxy = revocable.proxy;
console.log(proxy.foo); // "[[foo]]"
revocable.revoke();
console.log(proxy.foo); // возникает исключение TypeError
proxy.foo = 1; // снова TypeError
delete proxy.foo; // всё ещё TypeError
typeof proxy; // "object", typeof не вызывает никаких proxy-перехватчиков событий
Спецификации
Specification |
---|
ECMAScript Language Specification # sec-proxy.revocable |
Совместимость с браузерами
BCD tables only load in the browser