我仍然对咖啡脚本和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()
答案 0 :(得分:2)
您必须致电@run()
,因为run()
是本地函数调用。
class Dog extends Animal
sprint: () ->
run = (x) ->
alert x
run(4)
另一方面,@run()
是this.run()
JavaScript模拟。在您的示例中使用继承时,方法run
从Dog
扩展到Animal
,结果移至Dog
的原型。所以你应该从当前对象中调用run
。
为什么这个(@)用于创建静态方法以及引用 实例方法
@
这两种情况的标志不同。在您的示例中,如果要调用静态方法,则应在类内外编写Animal.myStaticMethod()
。但是当你需要在类中调用实例方法时,你使用@
就像在JS中等效this
一样。
查看CoffeeScript console中的小例子。正如您在右侧看到的那样staticMethod
未添加到原型中,因此它不是实例方法,在这种情况下,@
与@
中的@instanceMethod()
没有任何共同之处。< / p>