我有一个数组:
const arr = ['a', 'b', 'c']
我使用处理程序为该数组创建了一个代理,该处理程序将为每个 numberget
返回带有索引的属性。例如,将返回、–和– 。n - 1
n
p[1]
'a'
p[2]
'b'
p[3]
'c'
const p = new Proxy(arr, {
get: (target, property, receiver) => {
const parsed = parseInt(property, 10)
if (!Number.isNaN(parsed)) return target[parsed - 1]
return target[property]
}
})
它似乎工作正常。p[2]
,例如,给出'b'
应该的。但是,还有另一个问题。Array.prototype.indexOf()
不再正常工作。当我通过'a'
或时它确实有效'b'
- 它分别返回1
and 2
,但'c'
它返回-1
。事实证明,这indexOf()
也触发了get
处理程序。通过添加console.log(property)
到get
处理程序,我们得到以下输出p.indexOf('c')
:
'indexOf'
'length'
'0'
'1'
'2'
似乎indexOf()
内部检查了length
属性,然后将数组从 index 迭代0
到length - 1
.
如果我知道该属性是直接访问(如p[2]
)还是内部访问,那么解决这个问题将是微不足道的。然后我总是可以返回target[property]
内部访问(所以代理将是无操作的)。
如何区分代理get
处理程序中的直接访问和内部访问?
我唯一想到的就是抛出一个错误,捕获它并分析它的堆栈。尽管如此,这似乎是一种解决方法,而不是实际的解决方案,所以我想避免它,除非没有其他办法。