Proxy.revocable()

Baseline 已廣泛支援

此功能已成熟,可跨多種裝置和瀏覽器版本使用。自 ⁨2017 年 12 月⁩ 起,在瀏覽器中均可使用。

Proxy.revocable() 靜態方法建立一個可撤銷的 Proxy 物件。

語法

js
Proxy.revocable(target, handler)

引數

目標

要用 Proxy 包裝的目標物件。它可以是任何型別的物件,包括原生陣列、函式,甚至是另一個代理。

handler

一個物件,其屬性是函式,這些函式定義了在對 proxy 執行操作時的行為。

返回值

一個具有以下兩個屬性的普通物件

proxy

一個 Proxy 物件,與使用 new Proxy(target, handler) 呼叫建立的代理物件完全相同。

revoke

一個不帶引數的函式,用於撤銷(關閉)proxy

描述

Proxy.revocable() 工廠函式與 Proxy() 建構函式相同,不同之處在於,除了建立一個代理物件外,它還建立了一個 revoke 函式,可以呼叫該函式來停用代理。代理物件和 revoke 函式被包裝在一個普通物件中。

revoke 函式不接受任何引數,也不依賴於 this 值。建立的 proxy 物件作為 私有欄位 附加到 revoke 函式上,revoke 函式在被呼叫時透過自身訪問此私有欄位(私有欄位的存在從外部是無法觀察到的,但它會影響垃圾回收機制的工作方式)。proxy 物件 *不* 會被包含在 revoke 函式的 閉包 中(如果 revoke 仍然存在,這將導致 proxy 無法被垃圾回收)。

在呼叫 revoke() 函式後,代理將變得不可用:對任何 trap 的訪問都會丟擲 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® 2026 語言規範
# sec-proxy.revocable

瀏覽器相容性

另見