-1

Childを拡張するクラスがありますTestTestfromから関数を呼び出したいChild

私はこれを試しました:

class Test
    constructor: ->
        @i = 'hello world'

    f1: -> console.log @i
    f2: -> console.log 'hello'

class Child extends Test
    run: ->
        Test::f1()

hello = new Child()
hello.run()

を呼び出すとhello.run()、 が呼び出されますTest.f1()が、結果はundefinedです。@i実行前に静的変数を設定していませんTest.f1()

に切り替えるTest::f1()Test::f2()、正しい結果が得られます。

から実行するときにで定義されているように、 を作成するときに、どのように実行する必要があるかを知る必要がありTestます。constructornew Child()@iTestTest::f1()Child.run()

ありがとう!:D

4

2 に答える 2

0

これを行う1つの方法は次のとおりです。

class Test
  @i: 'hello world'

  @f1: -> console.log @i
  f2:  -> console.log 'hello'

class Child extends Test
  run: ->
    Test.f1()

hello = new Child()
hello.run()

i変数は静的であるため、コンストラクターで設定しても意味がないことに注意してください。また、f1メソッドも静的になりました。

(私は CoffeeScript の専門家ではないので、::構文が何のために必要なのかわかりません。)

于 2013-02-23T22:11:23.163 に答える
0

の新しいインスタンスを作成すると、コンストラクターが実行されますChild。問題は、あなたが呼び出す方法ですf1

あなたは言いたくないTest::f1()。は のサブクラスである@f1()ため、単に と言うことができます。これらは非常に重要な点で異なります:は を設定しないため、その関数が を要求すると、 のみが検出されます。言うことは言うことと同じです。これは、CoffeeScript のクラス システムで実現できる優れた機能の 1 つです。ChildTestTest::f1()thisthis.iundefinedthisWindow@f1()Test::f1.call(this)

最後に、衒学的な注意: あなたが書いたコードには静的変数はありません。i、あなたが書いたように、インスタンス変数です。静的変数は次のようになります。

class Test
  @staticVar = 1234

またはこのように:

class Test
  # ...

Test.staticVar = 1234

インスタンス変数は次のようになります。

class Test
  fn: -> 
    @instanceVar = 1234

またはこのように:

test = new Test()
test.instanceVar = 1234

または、次のようにすることもできます (すべてのインスタンス間で共有されるインスタンス変数のデフォルト値の場合):

Test::instanceVar = 1234

同じような調子で:

を呼び出すとhello.run()、 が呼び出されますTest.f1()が、結果はundefinedです。@i実行前に静的変数を設定していませんTest.f1()

あなたは決して電話していませんTest.f1()。を呼び出していますがTest::f1()、これは非常に異なります。あなたが書いたコードには、はありませTest.f1Test.prototype.f1

于 2013-02-23T23:05:04.193 に答える