====== JavaScript Proxy ====== --- //[[http://www.y2sunlight.com/water|y2sunlight]] 2021-07-19// ここではES2015[[js:top#ECMAScript|*2015]]で新たに追加された[[https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Proxy|Proxy]]オブジェクトについて説明します。 ===== Proxyオブジェクト ===== [[https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Proxy|Proxy]]を利用することで、既存のオブジェクトに手を加えずに変更することができます。 構文 new Proxy(target, handler) target : ラップするオブジェクト handler : 変更する操作を定義するためのオブジェクト(ハンドラー) 以下にメンバーの取得と設定に対する簡単なハンドラーを示します。 class Student { constructor(name, age) { this.name = name; this.age = age; } greeting() { console.log(`I am ${this.name}. I am ${this.age} years old.`); } } function createProxyStudent(name, age) { return new Proxy(new Student(name, age), { get(target, prop) { // メンバーが見つからない場合はそのままメンバー名を返す return prop in target ? target[prop] : prop; }, set(target, prop, val) { if(prop=="age" && !Number.isInteger(val)) { return false; } target[prop] = val; } }); } // オリジナルの鈴木さん let suzuki = new Student('Suzuki', 15); suzuki.greeting(); suzuki.age = "abc"; // I am Suzuki. I am 15 years old. suzuki.greeting(); // I am Suzuki. I am abc years old. console.log(suzuki.address); // undefined // 鈴木さんの代理人 let proxy_suzuki = createProxyStudent('Suzuki', 15); proxy_suzuki.greeting(); proxy_suzuki.age = "abc"; // I am Suzuki. I am 15 years old. proxy_suzuki.greeting(); // I am Suzuki. I am 15 years old. console.log(proxy_suzuki.address); // address ハンドラーに定義できるハンドラーメソッドには、以下のものがあります。なお、ハンドラーメソッドはトラップとも呼ばれることがあります。 ^ハンドラーメソッド^説明(いつ発生するか)^ |get|プロパティ読み取り時| |set|プロパティ書き込み時| |has|in 演算子| |deleteProperty|delete 演算子| |apply|関数呼び出し| |construct|new 演算子| |[[https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/getPrototypeOf|getPrototypeOf]]|プロトタイプの取得| |[[https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/setPrototypeOf|setPrototypeOf]]|プロトタイプの設定| \\