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