Classes et méthodes statiques dans coffeescript

86

Je veux écrire une classe d'assistance statique dans coffeescript. Est-ce possible?

classe:

class Box2DUtility

  constructor: () ->

  drawWorld: (world, context) ->

en utilisant:

Box2DUtility.drawWorld(w,c);
Shawn Mclean
la source

Réponses:

179

Vous pouvez définir des méthodes de classe en les préfixant avec @:

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

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

Démo: http://jsfiddle.net/ambiguous/5yPh7/

Et si vous voulez que vous drawWorldagissiez comme un constructeur, vous pouvez dire new @comme ceci:

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

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

Démo: http://jsfiddle.net/ambiguous/bjPds/1/

mu est trop court
la source
4
Serait constructor: (@s) ->également travailler dans le second exemple? (c'est-à-dire au lieu de l'assignation manuelle @s = s)
Tripp Lilley
1
@TrippLilley: Oui, vous pouvez le faire de cette façon si vous préférez.
mu est trop court le
Mais si nous mettons des méthodes dans «ceci», elles n'étaient plus vraiment statiques, n'est-ce pas? Les méthodes vraiment statiques doivent rester dans obj.prototype. Dans l'exemple de Shawn Mclean, nous pouvons appeler des méthodes comme celle-ci: Box2DUtility :: drawWorld (w, c);
Sergei Panfilov
1
@SergeyPanfilov: Mais tout dans le prototype est également disponible via this, c'est comme ça que JavaScript fonctionne, donc vous ne pouvez rien y faire. Nous n'avons pas vraiment de classes non plus, juste des objets, des prototypes et des fonctions de constructeur, donc la terminologie est encore plus confuse. Attacher des fonctions en tant que propriétés de la fonction constructeur (ce qui se passe ici) est l'équivalent le plus proche d'une méthode de classe que nous avons. Vérifiez que JavaScript Box2DUtility::drawWorld ne fonctionnera pas.
mu est trop court
1
@ AlvaroLourenço Semble qu'une classe CoffeeScript est un "bloc statique" (avec quelques trucs supplémentaires): jsfiddle.net/ambiguous/ap72ckax
mu est trop court