4

class を宣言しているとしGameます。

class @Game
    constructor: ->
        @id = Game.generateNewGameId() # <---
    player1: null
    player2: null
    @generateNewGameId: -> "blahblah23"

ここでは、generateNewGameIdasを使用していGame.generateNewGameId()ます。

これは正しい方法ですか、それとももっと良い方法がありますか? 使用してみましthis::generateNewGameId()たが、スコープが異なります。

4

2 に答える 2

13

generateNewGameId本当にクラスメソッドになりたい場合は、次を使用@constructorして取得できます。

インスタンスのプロトタイプを作成した Object 関数への参照を返します。このプロパティの値は、関数自体への参照であることに注意してください [...]

だから、このようなもの:

class Game
    constructor: ->
        @id = @constructor.generateNewGameId()
    @generateNewGameId: ->
        "blahblah23"

サブクラス化すると、これは正しいことを行うことに注意してくださいGame

class C extends Game # With an override of the class method
    @generateNewGameId: ->
        'pancakes'    

class C2 extends Game # or without

デモ (コンソールを開いてください): http://jsfiddle.net/ambiguous/Vz2SE/

于 2012-07-19T21:23:38.707 に答える
4

アクセス方法は問題ないと思います。なんらかの理由で@constructor.generateNewGameId()書きたくない場合もできますが、後者をお勧めします。Game.generateNewGameId()更新: @mu は言及が短すぎるため、@constructorインスタンスのコンストラクターを取得できます。これはGame(サブクラス内で) 異なる可能性があるため、柔軟性が高くなります。この場合、その柔軟性が必要な場合は、間違いなくそれを選択してください:)

generateNewGameId関数がクラスの外部からアクセスされない場合Gameは、クラス メソッドの代わりにプライベート関数を使用できます。

class @Game
  gameIdCounter = 0
  generateNewGameId = -> gameIdCounter++
  constructor: ->
    @id = generateNewGameId()
  player1: null
  player2: null

console.log (new Game).id # -> 0
console.log (new Game).id # -> 1

例は coffeescript.org にあります。

クラス内にはgameIdCounterとの両方generateNewGameIdのプライベート変数があります。Game

于 2012-07-19T21:27:59.950 に答える