Статичні класи та методи у 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/


4
Буде constructor: (@s) ->також працювати в другому прикладі? (тобто замість ручного призначення @s = s)
Тріпп Ліллі,

1
@TrippLilley: Так, ви могли б зробити це так, якщо хочете.
mu занадто короткий

Але якщо ми вкладаємо методи в "це", вони вже не були по-справжньому статичними, чи не так? Справді статичні методи повинні залишатися в obj.prototype. У прикладі Shawn Mclean ми можемо викликати такі методи: Box2DUtility :: drawWorld (w, c);
Сергій Панфілов

1
@SergeyPanfilov: Але все, що є в прототипі, також доступне через this, саме так працює JavaScript, тому ви нічого з цим не зробите. У нас насправді теж немає класів, а лише об'єкти, прототипи та функції конструктора, тому термінологія ще більше плутається. Приєднання функцій як властивостей функції конструктора (що саме тут відбувається) є найближчим еквівалентом методу класу, який ми маємо. Переконайтеся, що JavaScript Box2DUtility::drawWorld не буде працювати.
мю занадто коротке

1
@ AlvaroLourenço Здається, клас CoffeeScript є "статичним блоком" (з деякими додатковими матеріалами): jsfiddle.net/ambiguous/ap72ckax
mu занадто короткий
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.