Javascript拦截数组设置值

时间:2013-10-09 16:00:00

标签: javascript arrays prototype interceptor defineproperty

有没有办法拦截或覆盖数组设置器?例如:

var array = [];
array[2] = 10;
var myInterceptor = function(index, newVal) {
    do stuff when the array value at index is changed.
}

所以我希望在执行第二行时调用myInterceptor。 我希望找到一种方法来使用Object.defineProperty()

1 个答案:

答案 0 :(得分:0)

不幸的是,它是not possible to override the [] accessor for javascript arrays。不过还有其他一些可能性:

1)Override the push() method。这对于单个数组实例是合理的,但强烈建议您不要更改Array.prototype.push,因为这可能会导致javascript代码的其他部分出现意外的副作用。

2)添加自定义set()方法。同样,当您可以将其添加到核心阵列原型时,强烈建议您不要这样做。功能jsFiddle:http://jsfiddle.net/dmillz/RUcBM/

arr.set = function (index, value) {
    var oldValue = this[index];
    this[index] = value;
    $.event.trigger("array-change", [this, index, oldValue, value]); // jQuery event trigger, but feel free to use something else besides jQuery    
};

3)(推荐)创建一个由数组支持的自己的可观察类,或者只使用提供可观察对象的库,例如Knockout's Observable ArrayEmber's ObservableBackbone's Model