CoffeeScript类成员

CoffeeScript类成员,coffeescript,Coffeescript,我不熟悉CoffeeScript(而且对JS也没有太多经验;如果这太幼稚,那么很抱歉),我正在尝试创建一个类,如下所示: class Test a: [] make: -> @a.push ['A', 'B', 'C'] getdata: -> output = "" for i in @a output += i output b = new Test b.make() alert

我不熟悉CoffeeScript(而且对JS也没有太多经验;如果这太幼稚,那么很抱歉),我正在尝试创建一个类,如下所示:

class Test
   a: []

   make: ->
       @a.push ['A', 'B', 'C']

   getdata: ->
       output = ""
       for i in @a
          output += i
       output

b = new Test
b.make()

alert(b.getdata())


c = new Test
c.make()

alert(c.getdata())
我得到的结果是: “A,B,C” “A,B,C,A,B,C”


尽管创建了一个新的“Test”实例;数组被追加到上面,并且没有被清除。我做错了什么?是否初始化成员变量时出错?

当您定义
a:[]
时,您正在类原型上创建单个数组对象。创建的类的每个实例都将具有相同的数组对象。每当一个实例修改该值时,其他所有实例都可以看到该更改

请注意,只有在修改值(例如通过向数组中添加项)时才会出现这种情况。如果替换该值(例如,通过指定新数组),则这只会影响当前实例

当您希望在每个实例的基础上初始化属性时,您应该在实际创建实例时在
构造函数中定义它:

class Test
   constructor: ->
       @a = []
       @a.push ['A', 'B', 'C']

   getdata: ->
       output = ""
       for i in @a
          output += i
       output

b = new Test

alert(b.getdata())


c = new Test

alert(c.getdata())

您会发现它可以像您所希望的那样工作。

您应该看看原型是如何工作的,以及javascript生成的代码。我在coffeescript(甚至在教程/烹饪书中)中看到了很多这样的错误。我使用的规则是只定义类成员中的函数和静态属性(我使用@member语法在构造函数中定义实例属性)。是的,考虑到关键字class coffeescript的使用,这有点令人困惑。旁注:
getdata:->@a.join(“”)
谢谢Guillaume86和tokland。我从中学到了很多。关于这个主题:TypeScript以一种比coffeescript更合理的方式实现实例成员,你可以在这里尝试:难怪当你看到这样的事情时人们会感到困惑:谢谢!现在我明白了。更让我困惑的是行为上的修改/替换差异。现在这也被清除了。谢谢你的帮助。这个不好的建议在这里也被重复,我几乎陷入了同样的陷阱。我希望Coffeescript医生能就此提供建议。