说我正在宣布课程Game
。
class @Game
constructor: ->
@id = Game.generateNewGameId() # <---
player1: null
player2: null
@generateNewGameId: -> "blahblah23"
在这里,我使用generateNewGameId
作为Game.generateNewGameId()
。
这是正确的方式还是有更好的方法?我尝试使用this::generateNewGameId()
,但范围不同。
答案 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
gameIdCounter
类中的generateNewGameId
和Game
都是私有变量。