私は配列を持っています:
const arr = ['a', 'b', 'c']
get
ハンドラーを使用してその配列のプロキシを作成します。これはn - 1
、すべての number の index を持つプロパティを返します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'
orを渡すと機能'b'
します – それぞれ1
と2
を返しますが、 を'c'
返します-1
。これもハンドラーindexOf()
をトリガーすることがわかりました。ハンドラーにget
追加console.log(property)
することにより、次の出力が得られます。get
p.indexOf('c')
'indexOf'
'length'
'0'
'1'
'2'
プロパティをindexOf()
内部的にチェックしlength
、配列を index0
からまで反復しているようlength - 1
です。
p[2]
プロパティが直接アクセスされるか (のように) 内部的にアクセスされるかを知っていれば、それを修正するのは簡単です。その後、いつでも内部アクセスに戻ることができtarget[property]
ました (したがって、プロキシはノーオペレーションになります)。
get
Proxyハンドラで直接アクセスと内部アクセスを区別する方法は?
私の頭に浮かぶ唯一のことは、エラーをスローし、それをキャッチして、そのスタックを分析することです。それでも、これは実際の解決策というよりは回避策のように思われるので、他に方法がない限り避けたいと思います。