缓存代理让计算函数本身专注于自己的计算,而让代理对象实现缓存的功能。
<script>
var mult = function() {
var a = 1;
for(var i = 0, len = arguments.length; i < len; i++) {
a = a * arguments[i]
}
return a
}
var proxyMult = (function() {
var cache = {}
return function() {
var key = Array.prototype.join.call(arguments, ',')
if (key in cache) {
return cache[key]
}
return cache[key] = mult.apply(this, arguments)
}
})()
console.log(mult(1,2,3,4))
console.log(mult(1,2,3,4))
console.log(proxyMult(1,2,3,4, 5))
console.log(proxyMult(1,2,3,4, 5))
</script>
进一步扩展,如果有个加法运算,也需要进行缓存代理,则需要一个创建缓存代理的工厂。
var mult = function() {
var a = 1;
for(var i = 0, len = arguments.length; i < len; i++) {
a = a * arguments[i]
}
return a
}
var plus = function() {
var a = 0;
for(var i = 0, len = arguments.length; i < len; i++) {
a = a + arguments[i]
}
return a
}
var createProxyFactory = function(fn) {
var cache = {}
return function() {
var key = Array.prototype.join.call(arguments, ',')
if (key in cache) {
return cache[key]
}
return cache[key] = fn.apply(this, arguments)
}
}
var proxyMult = createProxyFactory(mult)
var proxyPlus = createProxyFactory(plus)
console.log(proxyMult(1,2,3,4))
console.log(proxyMult(1,2,3,4))
console.log(proxyPlus(1,2,3,4))
console.log(proxyPlus(1,2,3,4))