1

コーヒースクリプトとJavaScriptの継承における「これ」のスコープとコンテキストにまだ混乱しています。@myStaticMethod と @move の違いのように、静的メソッドの作成とインスタンス メソッドの参照に this(@) が使用されるのはなぜですか? どちらの場合も「this」は何を表していますか?

例えば

class Animal

    @myStaticMethod : () ->
            console.log this is a static method
    move:(numberOfLegs) ->
        console.log numberOfLegs + ' legs moving'

    run: (numberOfLegs) ->
        @move(numberOfLegs)

class Dog extends Animal

    sprint: () ->
        return @run(4)

dog = new Dog()
dog.sprint()
4

1 に答える 1

2

ローカル関数呼び出しである@run()ため、呼び出す必要があります。run()

class Dog extends Animal

sprint: () ->
    run = (x) ->
        alert x

    run(4)

一方@run()this.run()JavaScript アナログです。あなたの例で継承を使用すると、メソッドはfromにrun拡張され、その結果のプロトタイプに移動されます。したがって、現在のオブジェクトから呼び出す必要があります。DogAnimalDogrun

this(@) が静的メソッドの作成とインスタンス メソッドの参照に使用される理由

@この 2 つのケースでは符号が異なります。あなたの例では、静的メソッドを呼び出したい場合はAnimal.myStaticMethod()、クラスの内側と外側の両方に記述する必要があります。ただし、クラス内でインスタンス メソッドを呼び出す必要がある場合は、JS@と同じように使用します。this

CoffeeScript コンソールの小さな例を見てください。右側にstaticMethodあるように、 はプロトタイプに追加されていないため、インスタンス メソッドではなく、この場合はin@と共通するものはありません。@@instanceMethod()

于 2012-09-25T21:03:11.707 に答える