最終更新日 2024-09-25
~文法メモ~ メタメソッド
メタメソッド
オブジェクトやクラスインスタンスに対して、各種のフックが出来るようになっています。
例えば
- 「( )」を使って呼び出した時
- プロパティの値を取得/設定しようとした時
- イタレータオブジェクトとして扱おうとした時、などです。
Proxyの第1引数ですが、
「関数としての呼び出し」と、「プロパティの取得・設定」の両方を許すためには、第1引数に関数を渡しておく必要があります。
「プロパティの取得・設定」だけで良いのであれば、オブジェクトを渡せば大丈夫です。
var hook_obj = new Proxy( ()=>{}, {
// 関数としてhook_objを呼び出した時に反応する
apply(target, that, args) {
hm.debuginfo(args);
},
// プロパティを取得した時に反応する
get(target, prop, receiver) {
hm.debuginfo(prop)
return prop;
},
// プロパティを設定した時に反応する
set(target, prop, val, receiver) {
hm.debuginfo(prop, val);
return true;
}
}
);
hm.debuginfo(hook_obj["bbb"]);
hook_obj["aaa"] = 3;
hook_obj(10,20,30);
hm.debuginfo(hook_obj["bbb"]);
class MyClass {
constructor() {}
}
var original_ins = new MyClass();
var hook_ins = new Proxy(original_ins, {
get(target, prop, receiver) {
hm.debuginfo(prop)
return prop;
},
set(target, prop, val, receiver) {
hm.debuginfo(prop, val);
return true;
}
}
この他にもフック出来るハンドラーがいろいろ提供されています。