CoffeeScript中的类

时间:2014-07-26 16:08:01

标签: javascript coffeescript

CoffeScript中有以下类:

class MyClass

  f: (@x) ->

在JS中翻译此代码我们有:

(function() {
  var MyClass;

  MyClass = (function() {
    function MyClass() {}

    MyClass.prototype.f = function(x) {
      this.x = x;
    };

    return MyClass;
  })();
}).call(this);

我不明白为什么为了向MyClass添加功能我应该使用原型;为什么我不能使用'MyClass.f = function(x)......'?请解释一下。谢谢。

2 个答案:

答案 0 :(得分:2)

如果你定义

class MyClass 
    f: (@x) ->
    @g: (@x) ->
m = new MyClass()

你会发现,MyClass有一个g属性,但不是f,而m有一个f,但没有{{1} }}

要从g访问g,您必须使用m

另外m.constructor.g

要真正理解这一点,你需要深入研究Javascript的原型继承结构。

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/new

  

当执行代码new foo(...)时,会发生以下情况:

     
      
  • 创建一个新对象,继承自foo.prototype。

  •   
  • 使用指定的参数调用构造函数foo ...

  •   
  • 构造函数返回的对象成为整个新表达式的结果。 ...

  •   

所以关键点是新对象从类MyClass.prototype == m.__proto__继承(实际上是副本)。

答案 1 :(得分:0)

您不必使用原型链,您可以像这样分配静态方法:

class MyClass

  @f: (@x) ->

将输出:

var MyClass;

MyClass = (function() {
  function MyClass() {}

  MyClass.f = function(x) {
    this.x = x;
  };

  return MyClass;

})();