Statische Klassen und Methoden in Coffeescript


86

Ich möchte eine statische Hilfsklasse in Coffeescript schreiben. Ist das möglich?

Klasse:

class Box2DUtility

  constructor: () ->

  drawWorld: (world, context) ->

mit:

Box2DUtility.drawWorld(w,c);

Antworten:


179

Sie können Klassenmethoden definieren, indem Sie ihnen Folgendes voranstellen @:

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

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

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

Und wenn Sie möchten, dass Sie drawWorldsich wie ein Konstruktor verhalten, können Sie Folgendes sagen new @:

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
Würde constructor: (@s) ->auch im zweiten Beispiel funktionieren? (dh anstelle der manuellen Zuordnung @s = s)
Tripp Lilley

1
@TrippLilley: Ja, Sie könnten es so machen, wenn Sie es vorziehen.
Mu ist zu kurz

Aber wenn wir Methoden in "dies" einfügen, sind sie nicht mehr wirklich statisch, nicht wahr? Wirklich statische Methoden sollten in obj.prototype bleiben. Im Beispiel von Shawn Mclean können wir Methoden wie diese aufrufen: Box2DUtility :: drawWorld (w, c);
Sergei Panfilov

1
@SergeyPanfilov: Aber alles im Prototyp ist auch über verfügbar. thisSo funktioniert JavaScript, sodass Sie nichts dagegen tun können. Wir haben auch keine Klassen, nur Objekte, Prototypen und Konstruktorfunktionen, daher ist die Terminologie noch verwirrender. Das Anhängen von Funktionen als Eigenschaften der Konstruktorfunktion (was hier passiert) entspricht am ehesten einer Klassenmethode, die wir haben. Überprüfen Sie, ob JavaScript Box2DUtility::drawWorld nicht funktioniert.
Mu ist zu kurz

1
@ AlvaroLourenço Scheint, dass eine CoffeeScript-Klasse ein "statischer Block" ist (mit einigen zusätzlichen Sachen): jsfiddle.net/ambiguous/ap72ckax
mu ist zu kurz
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.