【JavaScript ECMAScript】Proxy::handler.preventExtensionsインスタンスメソッドの使い方
handler.preventExtensions()インスタンスメソッドの使い方について、初心者にもわかりやすく解説します。
基本的な使い方
handler.preventExtensions()メソッドは、JavaScriptのProxy(プロキシ)オブジェクトにおいて、ターゲットオブジェクトへの新しいプロパティの追加を禁止する操作(Object.preventExtensions())をトラップ(捕捉)し、その動作をカスタマイズするために実行するメソッドです。
このメソッドは、Proxyインスタンスに対してグローバルなObject.preventExtensions()関数が呼び出された際に実行されます。開発者がこのハンドラを定義することで、元のObject.preventExtensions()の挙動をオーバーライドしたり、プロパティ追加禁止の操作に対して追加のロジックを組み込んだりすることが可能になります。
handler.preventExtensions()メソッドは、引数としてProxyがラップしているターゲットオブジェクトを受け取ります。このターゲットオブジェクトに対して、拡張を禁止する操作を行うかどうかの判断や、実際の処理を記述します。
このメソッドの戻り値はブール値である必要があります。trueを返すと、Object.preventExtensions()操作は成功したとみなされます。一方、falseを返すと、操作は失敗したと判断され、その結果としてTypeErrorがスローされます。
重要な点として、このハンドラには「不変条件」という制約があります。もしターゲットオブジェクト自体がすでに拡張不可である場合、handler.preventExtensions()メソッドは必ずtrueを返さなければなりません。また、もしこのハンドラがtrueを返すのであれば、ターゲットオブジェクトも実際に拡張不可の状態にしなければなりません。具体的には、このハンドラがtrueを返した後でObject.isExtensible(target)がfalseとなるようにする必要があります。これらの不変条件が満たされない場合、JavaScriptエンジンはTypeErrorをスローして処理を停止します。
このハンドラを活用することで、Proxyオブジェクトを通じてターゲットオブジェクトの拡張可能性を、より柔軟かつ安全に制御できるようになります。
構文(syntax)
1const handler = { 2 preventExtensions(target) { 3 return true; 4 } 5}; 6 7const proxy = new Proxy({}, handler); 8Object.preventExtensions(proxy);
引数(parameters)
target
- target: object: 拡張を防止する対象となるオブジェクト
戻り値(return)
真偽値
このメソッドは、Proxy オブジェクトが拡張されないように設定された場合に true を返します。拡張が許可された場合は false を返します。