Javascript拦截数组设置值

标签 javascript arrays prototype interceptor defineproperty

有没有办法拦截或覆盖数组 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/

相关文章:

javascript - 当从 FF 下的 javascript 设置普通类时,CSS 伪类将不起作用

JavaScript : String to a two dimesional Array

arrays - 从字符串哈希中提取键

arrays - 获取一系列产品的 WooCommerce 产品标签

javascript - 如何扩展 Array.prototype.push()?

javascript - 使用 object.create 和 new 运算符创建继承之间的区别

javascript - 尝试访问原型(prototype)方法中的成员变量

javascript - 如何在 Cytoscape JS 中给出节点的行和列位置

javascript - IIS 是否存在 JavaScript 问题?

javascript - 如何实现 stickyfloat.js?