~文法メモ~ メタメソッド

メタメソッド

オブジェクトやクラスインスタンスに対して、各種のフックが出来るようになっています。
例えば

  • 「( )」を使って呼び出した時
  • プロパティの値を取得/設定しようとした時
  • イタレータオブジェクトとして扱おうとした時、などです。

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;
    }
}

この他にもフック出来るハンドラーがいろいろ提供されています。

詳細はMDNJavaScript リファレンス標準ビルトインオブジェクトProxy