Proxy.revocable()

Proxy.revocable() 静态方法创建一个可撤销的 Proxy 对象。

语法

js
Proxy.revocable(target, handler)

参数

target

要使用 Proxy 包装的目标对象。它可以是任何类型的对象,包括原生数组、函数,甚至另一个代理。

handler

一个对象,其属性是定义在对代理执行操作时其行为的函数。

返回值

一个具有以下两个属性的普通对象

proxy

一个与使用 new Proxy(target, handler) 调用创建的代理对象完全相同的代理对象。

revoke

一个没有参数的函数,用于撤销(关闭)代理。

描述

Proxy.revocable() 工厂函数与 Proxy() 构造函数相同,不同之处在于,除了创建代理对象之外,它还创建了一个 revoke 函数,该函数可以被调用以禁用代理。代理对象和 revoke 函数都封装在一个普通对象中。

revoke 函数不接受任何参数,也不依赖于 this 值。创建的 proxy 对象作为 私有属性 附加到 revoke 函数上,revoke 函数在被调用时访问自身上的该属性(私有属性的存在在外部不可观察,但它对垃圾回收是如何发生的具有影响)。proxy 对象不会被捕获在 revoke 函数的 闭包 中(如果 revoke 仍然存活,这将使 proxy 的垃圾回收变得不可能)。

revoke() 函数被调用后,代理将变得不可用:对处理程序的任何陷阱都会抛出一个 TypeError。一旦代理被撤销,它将保持撤销状态,再次调用 revoke() 不会有任何效果——事实上,对 revoke() 的调用会将 proxy 对象从 revoke 函数中分离,因此 revoke 函数将完全无法再次访问代理。如果代理在其他地方没有被引用,那么它将有资格进行垃圾回收。revoke 函数还会将 targethandlerproxy 中分离,因此,即使其代理仍然存活,如果 target 在其他地方没有被引用,它也将有资格进行垃圾回收,因为不再有任何方法可以有意义地与目标对象交互。

允许用户通过可撤销代理与对象交互,使您可以 控制公开给用户的对象的生命周期——即使用户仍然持有其代理的引用,您也可以使该对象成为垃圾回收的目标。

示例

使用 Proxy.revocable()

js
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 is thrown
proxy.foo = 1; // TypeError again
delete proxy.foo; // still TypeError
typeof proxy; // "object", typeof doesn't trigger any trap

规范

规范
ECMAScript 语言规范
# sec-proxy.revocable

浏览器兼容性

BCD 表格仅在启用 JavaScript 的浏览器中加载。

另请参阅