Давайте посмотрим на них по одному.
Для первого :
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;
})();
, поэтому вы можете видеть, что:
feet
будут видны всем Cow
методам. - Все
Cow
экземпляры будут использовать одни и те же feet
. feet
не являются общедоступными, так как вы не можете получить их, не вызвав метод Cow
(класс или экземпляр, либо подойдет). feet
невидимо для подклассов, поскольку оно не является свойством класса и не входит в prototype
(и поэтому не наследуется экземплярами подклассов).
Сводка : @utters
является разновидностью традиционной переменной класса, heads
является публичной переменной экземпляра со значением по умолчанию, а feet
является разновидностьюзакрытая переменная класса.