我正在扩展使用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()
中调用顶部命令的方法是正确的。我工作的项目似乎使用了这两种语法,所以我希望在使用之前我能理解每种语法的含义。
感谢。
答案 0 :(得分:2)
第一个Command
的主要含义是它是Object
,而不是Function
,因此无法直接删除它的实例。
有点令人困惑的是,init
方法包括commandDescriptions
(我只能在其他地方声明)和@addCommand
,Command
没有附加到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}}对象可以被认为是静态类变量。