Klasy i metody statyczne w skrypcie

86

Chcę napisać statyczną klasę pomocniczą w coffeescript. czy to możliwe?

klasa:

class Box2DUtility

  constructor: () ->

  drawWorld: (world, context) ->

za pomocą:

Box2DUtility.drawWorld(w,c);
Shawn Mclean
źródło

Odpowiedzi:

179

Możesz zdefiniować metody klas, poprzedzając je przedrostkiem @:

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

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

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

A jeśli chcesz, abyś drawWorldzachowywał się jak konstruktor, możesz powiedzieć new @tak:

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 jest za krótkie
źródło
4
Czy constructor: (@s) ->zadziałałoby również w drugim przykładzie? (tj. zamiast przypisywania ręcznego @s = s)
Tripp Lilley
1
@TrippLilley: Tak, możesz to zrobić w ten sposób, jeśli wolisz.
mu jest za krótkie
Ale jeśli umieścimy metody w „tym”, nie były one już tak naprawdę statyczne, prawda? Prawdziwie statyczne metody powinny pozostać w obj.prototype. Na przykładzie Shawna Mcleana możemy wywołać następujące metody: Box2DUtility :: drawWorld (w, c);
Siergiej Panfiłow
1
@SergeyPanfilov: Ale wszystko w prototypie jest również dostępne przez this, tak po prostu działa JavaScript, więc nie możesz nic z tym zrobić. Tak naprawdę nie mamy też klas, tylko obiekty, prototypy i funkcje konstruktorów, więc terminologia jest jeszcze bardziej zagmatwana. Dołączanie funkcji jako właściwości funkcji konstruktora (co się tutaj dzieje) jest najbliższym odpowiednikiem metody klasowej, jaką mamy. Sprawdź, czy JavaScript Box2DUtility::drawWorld nie działa.
mu jest za krótkie
1
@ AlvaroLourenço Wygląda na to, że klasa CoffeeScript jest „statycznym blokiem” (z dodatkowymi elementami
mu jest za krótkie.