在构造函数中调用静态方法 - CoffeeScript

时间:2012-07-19 20:46:44

标签: class static coffeescript

说我正在宣布课程Game

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

在这里,我使用generateNewGameId作为Game.generateNewGameId()

这是正确的方式还是有更好的方法?我尝试使用this::generateNewGameId(),但范围不同。

2 个答案:

答案 0 :(得分: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/

答案 1 :(得分:4)

我认为您访问它的方式是可以的。如果由于某种原因你不想写@constructor.generateNewGameId(),你也可以Game.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

gameIdCounter类中的generateNewGameIdGame都是私有变量。