【发布时间】:2017-10-21 04:28:02
【问题描述】:
我想将一些副作用与每个数组访问器相关联,例如a[i]。例如,如果副作用是向控制台写入消息,则以下程序:
var array = [1, 2, 3]
var total = 0;
for (var i in array) {
total += array[i]
}
console.log(total);
1 // access a[0]
2 // access a[1]
3 // access a[2]
6 // print original total
如果我有兴趣拦截数组方法push,我会使用此博客post 中的技术并提供一个拦截器:
var _push = Array.prototype.push;
Array.prototype.push = function( item ) {
console.log( 'pushing ', item, ' into ', this );
_push.apply( this, arguments );
}
是否可以将相同的技巧应用于数组访问器?或者对于这个问题有什么更好的解决方案?一个重要的注意事项是我不想修改程序的原始代码。因此,使用 JS proxies 拦截 getter 和 setter 似乎不是解决我的问题的有效选项。
我想介绍的一个特殊副作用是在访问的值未定义的情况下引发异常(JS 数组的索引的某些变体超出范围异常。)我会检查当前访问的值是否等于 @ 987654329@,并抛出异常,否则直接返回原值。
【问题讨论】:
-
@Mohamed 链接的问题并不能帮助 OP 覆盖内置数组的一般行为。
-
我同意@le_m
-
@le_m 但你可以用它来记录/抛出一个被问到的异常......
标签: javascript arrays metaprogramming intercept