Classes e métodos estáticos em coffeescript

86

Eu quero escrever uma classe auxiliar estática em coffeescript. Isso é possível?

classe:

class Box2DUtility

  constructor: () ->

  drawWorld: (world, context) ->

usando:

Box2DUtility.drawWorld(w,c);
Shawn Mclean
fonte

Respostas:

179

Você pode definir métodos de classe prefixando-os com @:

class Box2DUtility
  constructor: () ->
  @drawWorld: (world, context) -> alert 'World drawn!'

# And then draw your world...
Box2DUtility.drawWorld()

Demo: http://jsfiddle.net/ambiguous/5yPh7/

E se você quiser drawWorldque aja como um construtor, você pode dizer new @assim:

class Box2DUtility
  constructor: (s) -> @s = s
  m: () -> alert "instance method called: #{@s}"
  @drawWorld: (s) -> new @ s

Box2DUtility.drawWorld('pancakes').m()

Demo: http://jsfiddle.net/ambiguous/bjPds/1/

mu é muito curto
fonte
4
Será que constructor: (@s) ->também trabalham no segundo exemplo? (ou seja, em vez da atribuição manual @s = s)
Tripp Lilley
1
@TrippLilley: Sim, você poderia fazer assim, se preferir.
mu é muito curto
Mas se colocarmos métodos 'nisso', eles não serão mais estáticos, não é? Métodos verdadeiramente estáticos devem permanecer em obj.prototype. No exemplo de Shawn Mclean, podemos chamar métodos como este: Box2DUtility :: drawWorld (w, c);
Sergei Panfilov,
1
@SergeyPanfilov: Mas qualquer coisa no protótipo também está disponível através de this, é assim que o JavaScript funciona, então você não pode fazer nada a respeito. Na verdade, também não temos classes, apenas objetos, protótipos e funções de construtor, então a terminologia é ainda mais confusa. Anexar funções como propriedades da função construtora (que é o que está acontecendo aqui) é o equivalente mais próximo a um método de classe que temos. Verifique se o JavaScript Box2DUtility::drawWorld não funciona.
mu é muito curto
1
@ AlvaroLourenço Parece que uma classe CoffeeScript é um "bloco estático" (com algumas coisas extras): jsfiddle.net/ambiguous/ap72ckax
mu é muito curto