Coffeescript 咖啡脚本类-@和这个
我对咖啡脚本中@的用法感到困惑。我原以为这能奏效,但没用-Coffeescript 咖啡脚本类-@和这个,coffeescript,Coffeescript,我对咖啡脚本中@的用法感到困惑。我原以为这能奏效,但没用- obj=new class @x:5 getX:->return @x alert obj.getX() # undefined 另一方面,如果我们从@x:5中删除@,那么它会以某种方式工作- obj=new class x:5 getX:->return @x alert obj.getX() # 5 我认为@x类似于这个.x,但在第二种情况下,我没有定义@x。它为什么有效 我什么时候应该定义@x:5而不是
obj=new class
@x:5
getX:->return @x
alert obj.getX() # undefined
另一方面,如果我们从@x:5
中删除@
,那么它会以某种方式工作-
obj=new class
x:5
getX:->return @x
alert obj.getX() # 5
我认为@x类似于这个.x,但在第二种情况下,我没有定义@x。它为什么有效
我什么时候应该定义
@x:5
而不是x:5
?首先,您定义的是“静态的”x
,以及“非静态的”getX
。在第二个实例中,成员和方法都是非静态的
如果您给类命名,您将能够访问第一个版本的x
作为ClassName.x
:
class TestClass
@x: 5
y: 6
obj = new TestClass
TestClass.x # 5
obj.y # 6
通常,只有在类方法内部时才应该使用
@
;在类声明中,@
引用的this
可以看作是类本身。因此,类声明中的x
是一个实例变量,但要在方法中引用它,我需要使用@x
。我觉得这有点令人困惑。这就是大多数语言的行为方式。只有在对象的上下文中实际使用了一个方法,并且this
实际上有一个值时,才能使用this
。您可以使用getX:->
来定义方法,但在obj
中,您可以使用@getX()
。您不会试图定义@getX:->
..?那么实例变量不也应该与this
连接吗?如果语法是@y:6
,因为y
与this
绑定,所以更容易理解。在声明类时,this
非常不同。还没有实例化对象,只有类本身。这个
如何引用一个尚未实例化的对象实例?我不确定我是否正确。当我希望y
为6
时,我希望某个特定实例的y
为6
,不是吗?另一个问题-您知道如何通过非静态方法访问静态变量吗?例如,我如何编写一个实例方法来返回示例代码中的@x:5
?