Node.js v6から追加されたProxyオブジェクトを使ってオブジェクトのプロパティアクセスをカスタムする

Node.js v6から追加されたProxyオブジェクトを使ってオブジェクトのプロパティアクセスをカスタムする

Proxyクラスの第一引数にオブジェクトを指定して、第二引数にハンドラを指定します。


const obj = {
name: 'yamada',
age: 17
};
const handler = {
set: function(target, prop, value) {
console.log(value)
target[prop] = value.toUpperCase()
},
get: (target, prop)=> {
console.log(target[prop])
return target[prop].toUpperCase()
}
}
const proxy = new Proxy(obj, handler)
proxy.name = 'takahashi' // ここでsetが実行される
console.log(proxy.name) // ここでgetが実行される
view raw

gistfile1.txt

hosted with ❤ by GitHub

new Proxy(obj, handler)のobjはオブジェクトもしくは配列もしくはクラスのインスタンスを指定します。

handlerではset,get,construct,deleteなどが指定できます。objのプロパティにアクセスしたタイミングで実行されます。

proxy.nameに代入するタイミングでset:~が実行され、proxy.nameを出力する際にget:~が実行されます。

Proxyオブジェクトを使用することで、AOP的なことを実装することが可能になります。

クラスのメソッド実行時にメソッド名を出力する

メソッドの先頭にログを仕込んだりしますが、このログは本来メソッドの振る舞いとは関係ない為、先頭に1文ログ出力をするステートメントは書くことは好ましくないです。

Proxyオブジェクトを使えばメソッドの先頭箇所でログ出力する機能を分離することが可能になります。


class Data {
constructor() {}
_update() {
// 処理
}
_insert() {
// 処理
}
}
const index = new Proxy(new Data, {
get: (target, name) => {
console.log(`${name}メソッド Start`);
return target[name];
}
});
index._insert() // 各メソッドで最初にログ出力される
index._update() // 各メソッドで最初にログ出力される
view raw

gistfile1.txt

hosted with ❤ by GitHub

コメント

タイトルとURLをコピーしました