1

私は配列を持っています:

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'します – それぞれ12を返しますが、 を'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ハンドラで直接アクセスと内部アクセスを区別する方法は?

私の頭に浮かぶ唯一のことは、エラーをスローし、それをキャッチして、そのスタックを分析することです。それでも、これは実際の解決策というよりは回避策のように思われるので、他に方法がない限り避けたいと思います。

4

2 に答える 2

1

indexOfコメントで虎三郎が示唆しているように、考えられる解決策の 1 つは、ハンドラー内のプロパティに対して別の関数を返し、getそこで必要な操作を行うことです。具体的には、indexOf()メソッドをプロキシではなく元の配列で機能させることができます。そして結果に追加1します。

if (property === 'indexOf') {
  return (...args) => {
    const result = Reflect.apply(target.indexOf, target, args)
    return result === -1 ? result : result + 1
  }
}

作業コード スニペット:

const arr = ['a', 'b', 'c']
const p = new Proxy(arr, {
  get: function(target, property, receiver) {
    if (property === 'indexOf') {
      return (...args) => {
        const result = Reflect.apply(target.indexOf, target, args)
        return result === -1 ? result : result + 1
      }
    }
    const parsed = parseInt(property, 10)
    if (!Number.isNaN(parsed)) return target[parsed - 1]
    return target[property]
  }
})
console.log(p.indexOf('c'))

他の配列メソッドも同様に修正できます。

于 2016-08-12T14:01:16.877 に答える