0

まず、再帰的な無限ループのために、以下のコードは発生しません。配列のプッシュ関数をオーバーライドしようとしています。Coffeescript を使用して、ID を持つオブジェクトをプッシュし、配列に追加する前にそれらが一意であることを確認できるようにしたいと考えています。問題は、このオブジェクトを追加する変数が見つからないことです。

スーパー配列にオブジェクトを追加するにはどうすればよいですか?

class SpecialArray extends Array
  Array::push = (arg) ->
    added = $.grep @, (item) ->
        if item
           item.id == arg.id
    if added <= 0
      @push.call(@,arg) // won't work due to loop

このコードを実行すると発生するエラー: ここに画像の説明を入力

4

1 に答える 1

0

絶対に上書きしてはいけませんArray::push。あなたの場合、再帰的に呼び出しています。

探していると思います

class SpecialArray extends Array
  constructor: () ->
    ref = super
    ref.push = push
    ref
  push = (arg) ->
    unless !arg.id or arg.id in (item.id for item in @)
      Array::push arg

(コンパイル)

ただしnew SpecialArrayinstanceof SpecialArrayではなく、単純なArrayであり、上書きされたpushメソッドは複数の引数を処理しないことに注意してください。

于 2013-10-15T17:27:23.983 に答える