Clases y métodos estáticos en coffeescript

86

Quiero escribir una clase de ayuda estática en coffeescript. es posible?

clase:

class Box2DUtility

  constructor: () ->

  drawWorld: (world, context) ->

utilizando:

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

Respuestas:

179

Puede definir métodos de clase prefijándolos con @:

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

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

Demostración: http://jsfiddle.net/ambiguous/5yPh7/

Y si quieres drawWorldque actúes como un constructor, puedes decir new @así:

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

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

Demostración: http://jsfiddle.net/ambiguous/bjPds/1/

mu es demasiado corto
fuente
4
¿ constructor: (@s) ->También funcionaría en el segundo ejemplo? (es decir, en lugar de la asignación manual @s = s)
Tripp Lilley
1
@TrippLilley: Sí, puedes hacerlo de esa manera si lo prefieres.
mu es demasiado corto
Pero si ponemos métodos en 'esto', ya no serán realmente estáticos, ¿no es así? Los métodos verdaderamente estáticos deberían permanecer en obj.prototype. En el ejemplo de Shawn Mclean podemos llamar a métodos como este: Box2DUtility :: drawWorld (w, c);
Sergei Panfilov
1
@SergeyPanfilov: Pero cualquier cosa en el prototipo también está disponible a través this, así es como funciona JavaScript, por lo que no puede hacer nada al respecto. En realidad, tampoco tenemos clases, solo objetos, prototipos y funciones de constructor, por lo que la terminología es aún más confusa. Adjuntar funciones como propiedades de la función constructora (que es lo que está sucediendo aquí) es el equivalente más cercano a un método de clase que tenemos. Compruebe que JavaScript Box2DUtility::drawWorld no funcionará.
mu es demasiado corto
1
@ AlvaroLourenço Parece que una clase CoffeeScript es un "bloque estático" (con algunas cosas adicionales): jsfiddle.net/ambiguous/ap72ckax
mu es demasiado corto