1

我仍然对咖啡脚本和javascript继承中“this”的范围和上下文感到困惑。为什么 this(@) 用于创建静态方法以及引用实例方法,例如 @myStaticMethod 和 @move 之间的区别,“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 模拟。当您在示例中使用继承时,方法run将扩展到DogfromAnimal并因此移动到Dog的原型。所以你应该run从当前对象调用。

为什么 this(@) 用于创建静态方法以及引用实例方法

@这两种情况的迹象不同。在你的例子中,如果你想调用静态方法,你应该Animal.myStaticMethod()在类内部和外部编写。但是当你需要在类中调用实例方法时,你可以使用JS 中@的等价物this

看看CoffeeScript 控制台中的小例子。正如您在右侧看到的staticMethod那样,它没有添加到原型中,因此它不是实例方法,在这种情况下与in@没有任何共同之处。@@instanceMethod()

于 2012-09-25T21:03:11.707 回答