Proxy.revocable()
Proxy.revocable() メソッドは、取り消し可能な Proxy オブジェクトを作成するために使用します。
構文
js
Proxy.revocable(target, handler)
引数
target-
Proxyでラップする対象のオブジェクトです。これは一連のオブジェクト、例えばネイティブの配列、関数、他のプロキシーなどを取ることもできます。 handler-
プロキシー
pに対して操作が行われたときの動作を定義する関数をプロパティとするオブジェクトです。
返値
以下の 2 つのプロパティを持つプレーンなオブジェクトです。
proxy-
new Proxy(target, handler)呼び出しで生成したプロキシーオブジェクトです。 revoke-
proxyを無効にするための引数を持たない関数です。
解説
Proxy.revocable() はファクトリー関数で、Proxy() コンストラクターと同じですが、プロキシーオブジェクトを作成するだけでなく、プロキシーを無効にするために求められる revoke 関数を作成します。プロキシーオブジェクトと revoke 関数はプレーンオブジェクトにラップされています。
revoke 関数は引数を取らず、this 値にも頼りません。作成された proxy オブジェクトは revoke 関数にプライベートプロパティとして結び付けられ、revoke 関数が呼び出されたときに自分自身でアクセスします(プライベートプロパティの存在は外からは観測できませんが、ガーベジコレクションが発生する方法については影響があります)。proxy オブジェクトは revoke 関数のクロージャ内には収容されません(revoke がまだ生きている場合、proxy のガベージコレクションは不可能になります)。
revoke() 関数が呼び出された後、プロキシーは使用できなくなります。ハンドラーのトラップが発生すると TypeError が発生します。一度プロキシーが取り消されると、取り消されたままになり、再び revoke() を呼び出しても何の効果もありません。実際、revoke() を呼び出すと proxy オブジェクトを revoke 関数から切り離すので、revoke 関数が再びプロキシーにアクセスできることは全くありません。プロキシーが他の場所で参照されていない場合、ガベージコレクションの対象となります。revoke 関数は target と handler も proxy から切り離すので、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 が発生
proxy.foo = 1; // TypeError が発生
delete proxy.foo; // これも TypeError
typeof proxy; // "object" と表示。 typeof でトラップは発生しない
仕様書
| Specification |
|---|
| ECMAScript Language Specification # sec-proxy.revocable |
ブラウザーの互換性
BCD tables only load in the browser