Статические классы и методы в coffeescript

86

Я хочу написать статический вспомогательный класс в coffeescript. Это возможно?

класс:

class Box2DUtility

  constructor: () ->

  drawWorld: (world, context) ->

с помощью:

Box2DUtility.drawWorld(w,c);
Шон Маклин
источник

Ответы:

179

Вы можете определить методы класса, добавив к ним префикс @:

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

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

Демо: http://jsfiddle.net/ambiguous/5yPh7/

И если вы хотите, чтобы вы drawWorldдействовали как конструктор, вы можете сказать new @так:

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

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

Демо: http://jsfiddle.net/ambiguous/bjPds/1/

mu слишком короткий
источник
4
Будет ли constructor: (@s) ->работать и во втором примере? (т.е. вместо ручного задания @s = s)
Трипп Лилли
1
@TrippLilley: Да, вы можете сделать это так, если хотите.
mu слишком короткий
Но если мы поместим методы в this, они больше не будут по-настоящему статичными, не так ли? По-настоящему статические методы должны оставаться в obj.prototype. В примере с Шоном Маклином мы можем вызывать такие методы: Box2DUtility :: drawWorld (w, c);
Сергей Панфилов
1
@SergeyPanfilov: Но все, что есть в прототипе, также доступно через thisJavaScript, именно так работает JavaScript, поэтому вы ничего не можете с этим поделать. На самом деле у нас тоже нет классов, только объекты, прототипы и функции-конструкторы, поэтому терминология еще более запутана. Присоединение функций как свойств функции-конструктора (что здесь и происходит) является ближайшим эквивалентом имеющегося у нас метода класса. Проверить, что JavaScript Box2DUtility::drawWorld не работает.
mu слишком короткий
1
@ AlvaroLourenço Похоже, что класс CoffeeScript - это «статический блок» (с некоторыми дополнительными вещами): jsfiddle.net/ambiguous/ap72ckax
mu слишком короток