Члены класса CoffeeScript - PullRequest
       5

Члены класса CoffeeScript

11 голосов
/ 02 декабря 2011

Я новичок в 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 Ответ

23 голосов
/ 02 декабря 2011

Когда вы определяете 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())

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...