Classi e metodi statici in coffeescript


86

Voglio scrivere una classe helper statica in coffeescript. È possibile?

classe:

class Box2DUtility

  constructor: () ->

  drawWorld: (world, context) ->

utilizzando:

Box2DUtility.drawWorld(w,c);

Risposte:


179

È possibile definire metodi di classe anteponendoli a @:

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

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

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

E se vuoi che ti drawWorldcomporti come un costruttore, puoi dire in new @questo modo:

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/


4
Funzionerebbe constructor: (@s) ->anche nel secondo esempio? (cioè al posto dell'assegnazione manuale @s = s)
Tripp Lilley

1
@TrippLilley: Sì, potresti farlo in questo modo se preferisci.
mu è troppo breve il

Ma se mettiamo dei metodi in "questo", non sono più veramente statici, no? I metodi veramente statici dovrebbero rimanere in obj.prototype. Nell'esempio di Shawn Mclean possiamo chiamare metodi come questo: Box2DUtility :: drawWorld (w, c);
Sergei Panfilov

1
@SergeyPanfilov: Ma tutto nel prototipo è disponibile anche tramite this, è così che funziona JavaScript, quindi non puoi fare nulla al riguardo. Non abbiamo nemmeno classi, solo oggetti, prototipi e funzioni di costruzione, quindi la terminologia è ancora più confusa. Associare funzioni come proprietà della funzione di costruzione (che è ciò che sta accadendo qui) è l'equivalente più vicino a un metodo di classe che abbiamo. Verifica che JavaScript Box2DUtility::drawWorld non funzioni.
mu è troppo breve

1
@ AlvaroLourenço Sembra che una classe CoffeeScript sia un "blocco statico" (con alcune cose extra): jsfiddle.net/ambiguous/ap72ckax
mu è troppo breve
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.