Node.js v6から追加されたProxyオブジェクトを使ってオブジェクトのプロパティアクセスをカスタムする
Proxyクラスの第一引数にオブジェクトを指定して、第二引数にハンドラを指定します。
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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が実行される |
new Proxy(obj, handler)
のobjはオブジェクトもしくは配列もしくはクラスのインスタンスを指定します。
handlerではset,get,construct,deleteなどが指定できます。objのプロパティにアクセスしたタイミングで実行されます。
proxy.nameに代入するタイミングでset:~が実行され、proxy.nameを出力する際にget:~が実行されます。
Proxyオブジェクトを使用することで、AOP的なことを実装することが可能になります。
クラスのメソッド実行時にメソッド名を出力する
メソッドの先頭にログを仕込んだりしますが、このログは本来メソッドの振る舞いとは関係ない為、先頭に1文ログ出力をするステートメントは書くことは好ましくないです。
Proxyオブジェクトを使えばメソッドの先頭箇所でログ出力する機能を分離することが可能になります。
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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() // 各メソッドで最初にログ出力される |
KHI入社して退社。今はCONFRAGEで正社員です。関西で140-170/80~120万から受け付けております^^
得意技はJS(ES6),Java,AWSの大体のリソースです
コメントはやさしくお願いいたします^^
座右の銘は、「狭き門より入れ」「願わくは、我に七難八苦を与えたまえ」です^^
コメント