LOG

ProxyとReflect

作成日15/06/13

この記事を書いてる時点ではFirefoxでのみ動きます。

プロキシとは、開発者自身が JavaScript で動作を定義するオブジェクトです。
オブジェクトの既定動作は JavaScript エンジンに実装されており、たいていは C++ などの低レベル言語で記述されています。
プロキシは、オブジェクトの挙動のほとんどを JavaScript で定義できるようにします。
これは メタプログラミング API を提供するものと言われています。

引用
MDN Proxy
Proxyで見た用語
インターセプト横取り、傍受とかという意味
メタプログラミングプログラムを定義するプログラム
リフレクティブ・メタプログラミングプログラムが自分自身を処理すること
イントロスペクション(introspection):プログラム構造へのリードオンリーアクセスのみ可能。
自己書き換え(self-modification):プログラム構造の変更が可能。
インターセッション(intersession):プログラムの働きの一部を書き換え可能。
引用:ECMAScript 6 proxyによるメタプログラミング(1/11)
トラップインターセプト用のメソッド

Proxyではインターセッションを行うことが可能
ハンドラに定義出来るのは提供されているAPIのみ

let target = {
    prop : 1
};
let handler = {
    get(target,name){ return `value is ${target[name]}` },
    set(target,name,value){ target[name] = value * 2; },
    has(target,name){
        console.log(`have a ${name}?`);
        return Reflect.has(target,name);
        // 実際の処理は対象オブジェクトに任せたい場合
        // トラップごとに対象オブジェクトのメソッドを呼び出すのは面倒。
        // ※ 例えば、 return name in target; みたいな
        // そこでReflectオブジェクトを使って処理を対象オブジェクトに投げ返す。
    }
};
let proxy = new Proxy(target,handler);
// targetには何を入れても良い ネイティブの関数とかproxyとかもOK
// handlerはオブジェクトでそのメソッドでtargetの挙動を定義する

console.log(proxy.prop);
// -> value is 1

proxy.prop = 10;
console.log(proxy.prop);
// -> value is 20

console.log('prop' in proxy);
// -> have a prop?
// -> true