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又有私有变量。generateNewGameIdGame

于 2012-07-19T21:27:59.950 回答