Ale*_*xis 1 scope coffeescript
我不太确定CoffeeScript中不同变量的用途
class Cow
@utters = 1
constructor: (@name) ->
mutate:->
alert @utters
heads: 1
feet = 9
c = new Cow
Run Code Online (Sandbox Code Playgroud)
从我的调查来看,这似乎heads是公开的,feet是私人的.在搞清楚时name,我会感到困惑utters.因为name它或多或少地编译this.name = name并为utters它编译Cow.utters = 1.
所以我的问题是.它的范围utters和方式应该是什么?它的范围name和方式应该是什么?
mu *_*ort 10
让我们一一看一下.
对于第一个:
class Cow
@utters = 1
Run Code Online (Sandbox Code Playgroud)
this当你击中时它就是类本身,@utters = 1所以这@utters是一个类变量.JavaScript版本是这样的:
var Cow = (function() {
function Cow() {}
Cow.utters = 1;
return Cow;
})();
Run Code Online (Sandbox Code Playgroud)
子类将能够看到这一点,但他们将拥有自己的副本; 所以,为此:
class CowCow extends Cow
m: ->
CowCow.utters = 11
Run Code Online (Sandbox Code Playgroud)
CowCow.utters从1开始,但是在11之后(new CowCow).m(),Cow.utters将一直保持在1.
在第二个:
class Cow
heads: 1
Run Code Online (Sandbox Code Playgroud)
本质上是一个默认的实例变量; JavaScript版本如下所示:
var Cow = (function() {
function Cow() {}
Cow.prototype.heads = 1;
return Cow;
})();
Run Code Online (Sandbox Code Playgroud)
该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
Run Code Online (Sandbox Code Playgroud)
提醒1两次.
在第三个:
class Cow
feet = 9
m: -> alert feet
Run Code Online (Sandbox Code Playgroud)
是另一种类变量,但是这个变量非常私有:feet不是继承的,不是子类可见的,也不是外部可见的.JavaScript版本是这样的:
var Cow = (function() {
var feet = 9;
function Cow() {}
Cow.prototype.m = function() { return alert(feet) };
return Cow;
})();
Run Code Online (Sandbox Code Playgroud)
所以你可以看到:
feet将对所有Cow方法可见.Cow实例都将共享相同的内容feet.feet如果没有调用Cow方法(类或实例,也会这样做),你就无法获得它.feet对于子类是不可见的,因为它不是类的属性而且不在prototype(因此它不是由子类的实例继承).摘要:@utters是一种传统的类变量,heads是一个具有默认值的公共实例变量,feet是一种私有类变量.
| 归档时间: |
|
| 查看次数: |
825 次 |
| 最近记录: |