語法
Proxy.revocable(target, handler)
引數
返回值
一個具有以下兩個屬性的普通物件
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 函式還會將 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 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 |
瀏覽器相容性
載入中…