coffeescript中的静态类和方法


86

我想在coffeescript中编写一个静态助手类。这可能吗?

类:

class Box2DUtility

  constructor: () ->

  drawWorld: (world, context) ->

使用:

Box2DUtility.drawWorld(w,c);

Answers:


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
Tripp Lilley 2013年

1
@TrippLilley:是的,如果您愿意,可以这样做。
亩太短

但是,如果我们将方法放入“ this”中,它们就不再是真正的静态,不是吗?真正的静态方法应该保留在obj.prototype中。在Shawn Mclean的示例中,我们可以调用如下方法:Box2DUtility :: drawWorld(w,c);
谢尔盖·潘菲洛夫

1
@SergeyPanfilov:但是原型中的任何内容也可以通过访问this,这就是JavaScript的工作方式,因此您无能为力。我们实际上也没有类,只有对象,原型和构造函数,因此术语更加混乱。将函数作为构造函数的属性附加(这就是在这里发生的事情),这与我们拥有的类方法最接近。检查JavaScriptBox2DUtility::drawWorld 是否无效。
亩太短

1
@AlvaroLourenço似乎CoffeeScript类是“静态块”(有一些额外的东西):jsfiddle.net/ambiguous/ap72ckax
mu太短
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.