JS:是否可以在数组成员上定义getter函数?

use*_*299 5 javascript arrays oop getter

我没有找到有关此主题的任何信息,所以如果这是一个非常奇怪的问题,请原谅。

我知道JS允许将属性定义为访问器,这意味着它们在使用时会触发getter或setter函数。

我的问题是,是否可以对数组成员执行相同操作。

例如,我希望在进行如下分配时触发setter函数:

myObj[2] = 2 /* set function(value, index) { console.log(value + index) } */
Run Code Online (Sandbox Code Playgroud)

如果无法做到这一点,还有其他方法可以扩展[]操作吗?

Red*_*edu 5

基本上除非你子类化一个数组,否则你不能。

即使是子类化,数组也比对象动态得多。与对象不同,它们总是添加和删除项目,您必须能够将 getter 和 setter 与添加的项目一起动态附加到每个属性(键)。不实用。如果数组是子类化的,您可以使用 getter 和 setter 修改它的长度属性,并尝试观察数组从更改到它的长度属性,但这需要大量的数组差异。

我想对于数组,最好使用 ES6 代理对象。您可以按如下方式进行;

function ProxyMaker(a){
    return new Proxy(a, {
        get: function(target, property, receiver) {
            console.log(target+"'s "+property+" property has been accessed");
            return target[property];
        },
        set: function(target, property, value, receiver) {
            console.log(target+"'s "+property+" property has been modified");
            return target[property] = value;
        },
        has: function(target, property) {
            console.log(target+"'s "+property+" property has been checked");
            return Reflect.has(target, property); // 10x to @Bergi
        }
    });
}

var p = ProxyMaker([]);
p[0] = 1;
p[0];
p.push(10);
p.unshift(7);
console.log(JSON.stringify(p))
Run Code Online (Sandbox Code Playgroud)