4

呼び出し内でインスタンス メソッドにアクセスしようとしていますがmap、残念ながら、インスタンス オブジェクトへの参照が Window に再定義されています。インスタンスメソッドを取得する方法がわかりません:

class Test
  constructor: (@an_array) ->

  f: () ->
    @an_array.map (value) ->
      @a(value)

  a: (value) ->
    alert value

t = new Test [1, 2, 3]
t.f() // TypeError: Object [object Window] has no method 'a'

上記のコードへの機能リンクは次のとおりです

4

2 に答える 2

7

これに対処するにはさまざまな方法があります。

CoffeeScriptで最も一般的なのは、太い矢印(=>を使用してバインドされた関数を生成することです。

@an_array.map (value) => @a(value)

デモ: http: //jsfiddle.net/ambiguous/6BW8q/

標準のJavaScriptアプローチも機能します(場合によっては必要またはより適切になります)。

  1. コールバック関数の@内容を気にする必要がないように、への参照を保存します。this

    _this = @
    @an_array.map (value) -> _this.a(value)
    

    デモ: http: //jsfiddle.net/ambiguous/XhP4z/

    JavaScriptでを忘れた場合に発生する興味深いバグの存在と興味深いため、私はこの名前の_this代わりに使用する傾向があります。selfwindow.selfvar

  2. を使用してバインドされた関数を手動で作成しますがFunction.bind、これは完全にはサポートされていません。

    @an_array.map ((value) -> @a(value)).bind(@)
    

    デモ: http: //jsfiddle.net/ambiguous/n2XnC/

  3. jQuery $.proxy、Underscore _.bind、またはその他の非ネイティブのバインドされた関数の実装を使用します。

    @an_array.map _((value) -> @a(value)).bind(@)
    

    デモ: http: //jsfiddle.net/ambiguous/LAy9L/

どちらを選択するかは、環境と特定のニーズによって異なります。

  1. 他の場所からの関数をバインドしようとしている場合は使用できないため、上記の(2)または(3)のバリアント(またはおそらくまたは)=>を使用する必要があります。Function.callFunction.apply
  2. 内側と外側の両方が同時に必要な場合はthis(1)を使用します。
  3. 関数を手動でバインドする必要があるが、ネイティブbindが存在するかどうかわからない場合は、おそらく(3)になり、 (3)のどのブランチは、すでに使用可能なライブラリに依存する可能性があります。
  4. ..。
  5. 利益。
于 2013-01-25T00:44:04.857 に答える
1

への参照を保持する変数を定義することでそれができることがわかりましたthis

class Test
  constructor: (@an_array) ->

  f: () ->
    self = @
    @an_array.map (value) ->
      self.a(value)

  a: (value) ->
    alert value

t = new Test [1, 2, 3]
t.f()  // raises 3 alerts: 1, 2, 3

これが実際の例です。

これはちょっとしたハックのように感じるので、Q&A は誰かに任せて、これをどのように行うべきかを教えてもらいたいと思います。:D

于 2013-01-24T21:17:35.810 に答える