1

次のコードが10ではなく20を示すように、子クラスのコールバック関数のバインディングを変更したいと思います。

class A 
  @in = 10
  @b: =>
    alert(@in)

class B extends A
  @in = 20

  @w: ->
    window.setTimeout(@b,500)

B.w()

私がAbの定義を「細く矢印」にすると、バインディングはタイムアウト呼び出し関数になり、@inは未定義になります。太く矢印を付けると、親クラスAにバインドされます。子クラスのメソッドを再定義せずに、子クラスBにバインドしたいと思います。

ありがとう

4

1 に答える 1

1

コールを設定するときに、適切なバインディングを手動で強制するのが最善の方法だと思いますsetTimeout=>で定義するときにドロップ@bAます:

class A 
  #...
  @b: -> alert(@in)

そして、Bあなたが呼び出すときにバインディングを設定しますsetTimeout

class B extends A
  #...
  @w: ->
    f = => @b()
    window.setTimeout(f, 500)

これは、CoffeeScriptの疑似クラスメソッドを使用して取得できる限り近いと思います。

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

于 2013-02-12T00:57:34.207 に答える