Участники класса 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(b.getdata())


c = new Test
c.make()

alert(c.getdata())

Выход, который я получаю:    "A, B, C"    "A, B, C, A, B, C"

Несмотря на создание нового экземпляра 'Test'; массив добавляется и не очищается. Что я здесь делаю неправильно? Я неправильно инициализирую переменную-член?

Ответ 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())

Попробуйте это, и вы обнаружите, что он работает так, как вы хотите.