Coffeescript类语法在节点中有什么不同?

时间:2013-02-24 18:05:30

标签: node.js coffeescript frappe

我已经在前端使用coffeescript几年了。我熟悉类语法,看起来像这样:

  class MyClass
      methodOne : ->
         console.log "methodOne Called"
      methodTwo : (arg, arrg) ->
         console.log "methodTwo Called"

最近,我一直在使用节点和带有coffeescript和node的Web应用程序的frappe样板。

此脚本使用CoffeeScript类进行具有以下语法的路由:

  class MyClass
      @methodOne = ->
         console.log "methodOne Called"
      @methodTwo = (arg, arrg) ->
         console.log "methodTwo Called"

我可以从正常用法中注意到的唯一用法差异是Routes.coffee文件直接使用该类而不是生成new对象。所以:

   MyClass.methodOne()

   # vs

   new MyClass().methodOne()

现在我已经了解到@methodOne语法没有使用.prototype而其他语法没有。但为什么这会使用失败?

1 个答案:

答案 0 :(得分:2)

因此,以@开头的方法是类方法,其他所有方法都是实例方法。使用实例方法,:实质上意味着公共,其中=表示私有。 CoffeeScript中的类方法不存在“公共”与“私有”二分法,因此:=可以执行此操作。他们都是公开的。

例如,看看这个类:

class MyClass
  @methodOne = -> 
  @methodTwo : -> 
  methodThree : ->
  methodFour = -> 

评估以下JavaScript:

var MyClass;

MyClass = (function() {
  var methodFour;

  function MyClass() {}

  MyClass.methodOne = function() {};
  MyClass.methodTwo = function() {};
  MyClass.prototype.methodThree = function() {};
  methodFour = function() {};

  return MyClass;

})();

因此,methodOnemethodTwo都是公共类方法,methodThree可以继续使用原型,因此它是一个公共实例方法,methodFour成为一个变量在类中可以在内部使用但永远不会公开暴露。

希望能回答你的问题吗?