1

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

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

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

4

2 回答 2

0

不幸的是,无法覆盖[]javascript 数组的访问器。不过,还有其他一些可能性:

1)覆盖push()方法。对于单个数组实例这样做是合理的,但强烈建议您不要更改Array.prototype.push,因为这可能会在 javascript 代码的其他部分中导致意外的副作用。

2)添加自定义set()方法。同样,虽然您可以将其添加到核心 Array 原型中,但强烈建议您不要这样做。运行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 的 Observable ArrayEmber 的 ObservableBackbone 的 Model

于 2013-10-10T15:51:25.897 回答
0

你可以做的是使用Proxy类来拦截set方法。

var handler = { 
    set: (base,idx,val) => { 
        console.log('values:',base,idx,val); base[idx] = val; 
    } 
};

var mylist = new Proxy([],handler)
mylist[0] = 1
mylist
    > Proxy {0: 1}
Array.isArray(mylist)
    > true
于 2021-11-11T13:17:40.547 回答