javascript - javascript数组上的getter/setter?

标签 javascript arrays setter getter

有没有办法在数组上获取/设置行为?我想象这样的事情:

var arr = ['one', 'two', 'three'];
var _arr = new Array();

for (var i = 0; i < arr.length; i++) {
    arr[i].__defineGetter__('value',
        function (index) {
            //Do something
            return _arr[index];
        });
    arr[i].__defineSetter__('value',
        function (index, val) {
            //Do something
            _arr[index] = val;
        });
}

最佳答案

使用 Proxies ,您可以获得所需的行为:

var _arr = ['one', 'two', 'three'];

var accessCount = 0;
function doSomething() {
  accessCount++;
}

var arr = new Proxy(_arr, {
  get: function(target, name) {
    doSomething();
    return target[name];
  }
});

function print(value) {
  document.querySelector('pre').textContent += value + '\n';
}

print(accessCount);      // 0
print(arr[0]);           // 'one'
print(arr[1]);           // 'two'
print(accessCount);      // 2
print(arr.length);       // 3
print(accessCount);      // 3
print(arr.constructor);  // 'function Array() { [native code] }'
<pre></pre>

代理构造函数将创建一个对象来包装我们的数组,并使用称为陷阱的函数来覆盖基本行为。 get 函数将被调用以进行任何 属性查找,并在返回值之前调用doSomething()

代理是 ES6 的一项功能,在 IE11 或更低版本中不受支持。参见 browser compatibility list.

关于javascript - javascript数组上的getter/setter?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2449182/

相关文章:

python - 当属性用作装饰器时,setter 不会引发异常

testing - 代表的 Sould setter 在界面中?

javascript - 使用 JQuery 样式化嵌套滚动条

javascript - Firebase getValue() 未按预期运行

javascript - 无法弄清楚如何使用 javascript 在浏览器中导入模块

c++ - 在 C++ 中用随机数填充二维数组

javascript - 选择两个单选按钮

PHP 数组合并并删除重复项

php - 数组和循环管理

Java 泛型 : Use this type as return type?