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

  • メタメソッド

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

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

    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