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