1

几年来,我一直在前端使用咖啡脚本。并且熟悉看起来像这样的类语法:

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

最近我一直在使用 node 和frappe样板,用于使用 coffeescript 和 node 的 web 应用程序。

此脚本使用 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,而其他语法使用。但是为什么这会使使用失败呢?

4

1 回答 1

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成为类中的一个变量,可以在内部使用但永远不会公开。

希望能回答你的问题?

于 2013-02-24T18:46:50.323 回答