小编Ale*_*sov的帖子

拦截JavaScript数组访问器

我想将一些副作用与每个数组访问器相关联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 total
Run 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,并抛出一个异常,在这种情况下,否则只返回原始值.

javascript arrays metaprogramming intercept

5
推荐指数
1
解决办法
1065
查看次数

标签 统计

arrays ×1

intercept ×1

javascript ×1

metaprogramming ×1