有没有办法拦截或覆盖数组设置器?例如:
var array = [];
array[2] = 10;
var myInterceptor = function(index, newVal) {
do stuff when the array value at index is changed.
}
所以我希望在执行第二行时调用myInterceptor。 我希望找到一种方法来使用Object.defineProperty()
答案 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 Array,Ember's Observable或Backbone's Model