有人可以向我解释这个coffeescript语法吗?

时间:2014-05-07 23:58:43

标签: google-chrome-extension coffeescript

我正在扩展使用coffeescript编写的chrome扩展程序并且遇到了这种语法:

Commands =
  init: ->
    for command, description of commandDescriptions
      @addCommand(command, description[0], description[1])

  availableCommands: {}
  keyToCommandRegistry: {}

我想检查一下这个语法和一个类之间的区别(假设是这样的):

class Commands
  init: ->
    for command, description of commandDescriptions
      @addCommand(command, description[0], description[1])

  availableCommands: {}
  keyToCommandRegistry: {}

只是前者没有原型吗?我是否正确地认为在Commands.init()中调用顶部命令的方法是正确的。我工作的项目似乎使用了这两种语法,所以我希望在使用之前我能理解每种语法的含义。

感谢。

1 个答案:

答案 0 :(得分:2)

第一个Command的主要含义是它是Object,而不是Function,因此无法直接删除它的实例。

有点令人困惑的是,init方法包括commandDescriptions(我只能在其他地方声明)和@addCommandCommand没有附加到Command对象。如果@addCommand没有Command,我希望它是singleton。但是,由于Command上未声明的方法预计存在,@variables中的功能组似乎是mixed into另一个类。

修改

为了澄清,对象可以拥有init。在availableCommands函数中,您可以将keyToCommandRegistry@availableCommands引用为@keyToCommandRegistry@addCommand。但是,在此特定示例中,Command未在任何位置声明。我原以为它会被声明为CommandsA = init: -> for command, description of commandDescriptions @addCommand(command, description[0], description[1]) availableCommands: {} keyToCommandRegistry: {} addCommand: (command, descriptionInfo, otherDescriptionInfo) -> #Does some stuff 对象声明的一部分,如:

addCommand

如果您可以找到宣布Command的位置,则有助于了解Command的使用方式。

另外值得注意的是:由于availableCommands是一个对象而不是一个类,因此keyToCommandRegistry和{{1}}对象可以被认为是静态类变量。