【问题标题】:CoffeeScript Class MembersCoffeeScript 类成员
【发布时间】:2011-12-02 19:15:25
【问题描述】:

我是 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” “甲、乙、丙、甲、乙、丙”

尽管创建了一个新的 'Test' 实例;数组被追加并且不被清除。我在这里做错了什么?我是不是初始化成员变量错了?

【问题讨论】:

  • 你应该看看原型是如何工作的,看看javascript生成的代码。我在咖啡脚本中看到了很多这样的错误(即使在教程/食谱中)。我使用的规则是只在类成员中定义函数和静态属性(我在构造函数中使用@member 语法定义实例属性)。是的,考虑到关键字 class coffeescript 的使用,这有点令人困惑。
  • 旁注:getdata: -> @a.join('')
  • 感谢 Guillaume86 和 tokland。我从中学到了很多。
  • 与该主题相关:TypeScript 以比咖啡脚本 IMO 更明智的方式实现实例成员,您可以在这里尝试:typescriptlang.org/Playground

标签: coffeescript


【解决方案1】:

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

请注意,仅当您修改一个值时才会出现这种情况,例如向数组中添加项目。如果您替换该值,例如通过分配一个新数组,这只会影响当前实例。

如果您想要基于每个实例初始化的属性,您应该在实际创建实例时在constructor 中定义它:

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

Try this out,你会发现它可以如你所愿。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-06-08
  • 2011-11-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多