"这个"的范围是什么?在coffeescript课程

时间:2012-09-25 20:50:50

标签: inheritance coffeescript

我仍然对咖啡脚本和javascript继承中的“this”的范围和上下文感到困惑。为什么这个(@)用于创建静态方法以及引用实例方法,比如@myStaticMethod和@move之间的区别,在这两种情况下代表什么是“this”?

e.g。

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()

1 个答案:

答案 0 :(得分:2)

您必须致电@run(),因为run()是本地函数调用。

class Dog extends Animal

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

    run(4)

另一方面,@run()this.run() JavaScript模拟。在您的示例中使用继承时,方法runDog扩展到Animal,结果移至Dog的原型。所以你应该从当前对象中调用run

  

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

@这两种情况的标志不同。在您的示例中,如果要调用静态方法,则应在类内外编写Animal.myStaticMethod()。但是当你需要在类中调用实例方法时,你使用@就像在JS中等效this一样。

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