有没有办法拦截或覆盖数组 setter ?例如:
var array = [];
array[2] = 10;
var myInterceptor = function(index, newVal) {
do stuff when the array value at index is changed.
}
所以我希望在执行第二行时调用 myInterceptor。 我希望找到一种方法来使用 Object.defineProperty()
最佳答案
不幸的是,它是not possible to override the []
accessor for javascript arrays 。不过,还有其他一些可能性:
1) Override the push()
method 。对于单个数组实例来说,这样做是合理的,但强烈建议您不要更改 Array.prototype.push ,因为这可能会导致 JavaScript 代码的其他部分出现意外的副作用。
2) 添加自定义 set()
方法。同样,虽然您可以将其添加到核心数组原型(prototype)中,但强烈建议您不要这样做。运行 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
关于Javascript拦截数组设置值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19276990/