— y2sunlight 2021-07-19
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 演算子 |
| getPrototypeOf | プロトタイプの取得 |
| setPrototypeOf | プロトタイプの設定 |