2012-07-19 71 views
4

說我正在聲明一個類Game在構造函數中調用靜態方法 - CoffeeScript

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

在這裏,我使用generateNewGameId作爲Game.generateNewGameId()

這是正確的方式還是有更好的方法?我試過使用this::generateNewGameId()但範圍的不同。

+0

呃,你有沒有試過'@id = @generateNewGameId()'? – 2012-07-19 20:50:51

+0

@MariusKjeldahl'@generateNewGameId()'是一種靜態方法。如果它是一種實例方法,你提到的將會起作用。 – 2012-07-20 11:54:11

回答

13

如果你真的想generateNewGameId是一個類的方法,那麼你可以使用@constructor得到它:

返回到創建實例的原型對象函數的引用。請注意,此屬性的值是函數本身的引用[...]

因此,像這樣:

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/

+0

正是我在找的東西! – 2012-07-20 11:55:46

+0

這是值得看@流行病的答案。這可能是大多數人正在尋找的。 – 2012-07-20 12:03:25

4

我覺得你的方式重新訪問它是可以的。如果你不想寫Game.generateNewGameId()出於某種原因,你也可以做@constructor.generateNewGameId(),但我更喜歡後者。更新:如@mu is too short mentions@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 

Example at coffeescript.org

gameIdCountergenerateNewGameId都是Game類中的私有變量。