Типы переменных в CoffeeScript - PullRequest
       3

Типы переменных в CoffeeScript

1 голос
/ 19 февраля 2012

Я не совсем уверен, что использование различных переменных в CoffeeScript

class Cow
  @utters = 1

  constructor: (@name) ->

  mutate:->
     alert @utters

  heads: 1
  feet = 9


c = new Cow 

Из моего исследования кажется, что heads является общедоступным, а feet - частнымМое замешательство приходит при выяснении name и utters.Для name он более или менее компилируется в this.name = name, а для utters он компилируется в Cow.utters = 1.

Так что мои вопросы таковы.Какова область действия utters и как к ней следует обращаться?Какова область действия name и как к ней следует обращаться?

1 Ответ

10 голосов
/ 19 февраля 2012

Давайте посмотрим на них по одному.

Для первого :

class Cow
  @utters = 1

this - это сам класс, когда вы нажмете @utters = 1 так что @utters является своего рода переменной класса.Версия JavaScript такова:

var Cow = (function() {
  function Cow() {}
  Cow.utters = 1;
  return Cow;
})();

Подклассы смогут увидеть это, но у них будет своя копия;Итак, для этого:

class CowCow extends Cow
  m: ->
    CowCow.utters = 11

CowCow.utters начинается с 1, но будет 11 после (new CowCow).m(), а Cow.utters будет оставаться на 1 на всем протяжении.

The second :

class Cow
  heads: 1

по сути является переменной экземпляра по умолчанию;версия JavaScript выглядит следующим образом:

var Cow = (function() {
  function Cow() {}
  Cow.prototype.heads = 1;
  return Cow;
})();

Часть Cow.prototype.heads = 1; означает, что heads наследуется и присоединяется к экземплярам, ​​а не к классам.

В результате получается следующее:

class Cow
  heads: 1

class CowCow extends Cow
  m: ->
    alert @heads
    @heads = 11

(new CowCow).m()
alert (new Cow).heads

предупреждает 1 дважды.

Третий :

class Cow
  feet = 9
  m: -> alert feet

- это еще одна переменная класса, но она очень закрытая: feet не наследуется, не виден подклассам и не виден внешнему миру.Версия JavaScript такова:

var Cow = (function() {
  var feet = 9;
  function Cow() {}
  Cow.prototype.m = function() { return alert(feet) };
  return Cow;
})();

, поэтому вы можете видеть, что:

  1. feet будут видны всем Cow методам.
  2. ВсеCow экземпляры будут использовать одни и те же feet.
  3. feet не являются общедоступными, так как вы не можете получить их, не вызвав метод Cow (класс или экземпляр, либо подойдет).
  4. feet невидимо для подклассов, поскольку оно не является свойством класса и не входит в prototype (и поэтому не наследуется экземплярами подклассов).

Сводка : @utters является разновидностью традиционной переменной класса, heads является публичной переменной экземпляра со значением по умолчанию, а feet является разновидностьюзакрытая переменная класса.

...