我想将一些副作用与每个数组访问器相关联a[i].例如,如果副作用是将消息写入控制台,则以下程序:
var array = [1, 2, 3]
var total = 0;
for (var i in array) {
total += array[i]
}
console.log(total);Run Code Online (Sandbox Code Playgroud)
1 // access a[0]
2 // access a[1]
3 // access a[2]
6 // print original totalRun Code Online (Sandbox Code Playgroud)
如果我对拦截数组方法感兴趣push,我会使用此博客文章中的技术并提供拦截器:
var _push = Array.prototype.push;
Array.prototype.push = function( item ) {
console.log( 'pushing ', item, ' into ', this );
_push.apply( this, arguments );
}Run Code Online (Sandbox Code Playgroud)
是否可以将相同的技巧应用于数组访问器?或者对于这个问题更好的解决方案是什么?一个重要的注意事项是我不想修改程序的原始代码.因此,使用JS proxies来拦截getter和setter似乎不是我的问题的有效选项.
我要介绍的一个特殊副作用是在访问值未定义的情况下引发异常(JS数组的索引超出范围异常的一些变化.)我将检查当前访问的值是否等于undefined,并抛出一个异常,在这种情况下,否则只返回原始值.