CoffeeScript中的变量类型

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)

所以你可以看到:

  1. feet将对所有Cow方法可见.
  2. 所有Cow实例都将共享相同的内容feet.
  3. feet如果没有调用Cow方法(类或实例,也会这样做),你就无法获得它.
  4. feet对于子类是不可见的,因为它不是类的属性而且不在prototype(因此它不是由子类的实例继承).

摘要:@utters是一种传统的类变量,heads是一个具有默认值的公共实例变量,feet是一种私有类变量.