让我们一个一个来看看这些。
对于first one:
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场一路过关斩将。
的second one:
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的两倍。
的third one:
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
是排序的私有类变量。
哇。非常感谢详细的解释。它真的帮了大忙! – Alexis 2012-02-19 10:04:40
很好的解释! – Richard 2015-11-12 13:24:48