我有这样的代理:

var pr = new Proxy([],...);


在不提供所有详细信息的情况下,将其设置为捕获整数并从相应索引处的另一个(实际)数组“ B”返回对象。因此,例如pr [3]将返回B [3] .someProperty。它还捕获“长度”并返回数组“ B”的长度。但是,实际上从未将值直接直接分配给pr“数组”。因此,您看到它有点像“伪”数组。它仅反映数组“ B”,不包含任何实际值。

问题在运行测试(pr中的someinteger)时出现。当然,根据我的描述,该测试将始终返回false。该测试似乎未在代理中运行代码,因此我似乎无法捕获它并为其计算收益。可以吗

这会导致Array.prototype迭代器方法出现问题,因为其中许多方法会执行该测试。我可以将自己的相应方法编写为代理中的陷阱,但我想找到一种更简单的方法。如果有一种方法可以处理“ in”运算符,则可以节省很多额外的代码。

是否有我看不见的东西,或者解决此问题的方法?

最佳答案

代理有一个in陷阱,称为has
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Proxy/handler/has

var a = "abcd".split("");
var pr = new Proxy(a, {
    has: function(target, prop) {
        return (prop === "length" || +prop === (prop >>> 0) && +prop < target.length);
    },

    get: function(target, prop) {
        if(prop === "length") return target.length;

        if(+prop === (prop >>> 0) && +prop < target.length)
            return target[prop];
        return void 0;
    }
});

console.log(2 in pr, pr[2]);
console.log(5 in pr, pr[5]);

07-26 00:05
查看更多