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

1
@TrippLilley:はい、必要に応じてそのようにすることができます。
muは短すぎる

しかし、メソッドを「this」に入れると、それらはもはや本当に静的ではありませんでしたね。本当に静的なメソッドはobj.prototypeにとどまる必要があります。Shawn Mcleanの例では、次のようなメソッドを呼び出すことができます。Box2DUtility:: drawWorld(w、c);
セルゲイパンフィーロフ2014年

1
@SergeyPanfilov:しかし、プロトタイプのすべてのものは、を通じても利用できますthis。これがJavaScriptの動作方法であるため、JavaScriptについては何もできません。実際にはクラスもありません。オブジェクト、プロトタイプ、コンストラクター関数だけなので、用語はさらに混乱します。コンストラクター関数のプロパティとして関数をアタッチすること(これがここで起こっていることです)は、私たちが持っているクラスメソッドに最も近いものです。JavaScriptBox2DUtility::drawWorld が機能しないことを確認してください。
muは短すぎる

1
@AlvaroLourençoCoffeeScriptクラスは「静的ブロック」のようです(追加のものがいくつかあります):jsfiddle.net/ambiguous/ap72ckax –mu
が短すぎます
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.