proxyを使ってラップしてやると、関数に直接機能を追加しなくても機能を追加できるので便利です。
今回はcall-proxy
を使って関数の呼び出し回数や全実行結果を取得します。
akameco/call-proxy: call proxy
yarn add call-proxy
const callProxy = require('call-proxy')
let i = 0
const hello = () => `hello ${++i}`
const x = callProxy(hello)
x()
x()
console.log(x.__times__)
// => 2
x()
console.log(x.__times__)
// => 3
console.log(x.__calls__)
// [ 'hello 1', 'hello 2', 'hello 3' } ]
このように関数に__times__
と__calls__
というプロパティを追加します。
__times__
は今までの実行回数を取得し、__calls__
は今までの実行結果を取得できます。
実行自体は単純で以下の通りです。
module.exports = func => {
const calls = []
const handler = {
apply(target, prop, args) {
const result = Reflect.apply(target, prop, args)
calls.push(result)
return result
},
get(target, prop, receiver) {
if (prop === '__times__') {
return calls.length
} else if (prop === '__calls__') {
return calls
}
return Reflect.get(target, prop, receiver)
},
}
return new Proxy(func, handler)
}
akameco/call-proxy: call proxy
関連
【JavaScript】うるせぇお前がGolangになるんだよ - Qiita
【Proxy】JavaScriptでRubyのtimesを使う - Qiita
君は知るだろう。何をするにもその軌跡は残るということを https://t.co/P63nmYQPVy pic.twitter.com/HNNwb5fX4p
— あかめ@🤯.js (@akameco) July 28, 2018
ちょっと__calls__
の結果をこのときから変えた。