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

スポンサーリンク
  • このエントリーをはてなブックマークに追加
  • Evernoteに保存Evernoteに保存
スポンサーリンク

コメントをどうぞ

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA