【问题标题】:Call static method in constructor — CoffeeScript在构造函数中调用静态方法——CoffeeScript
【发布时间】:2012-07-19 20:46:44
【问题描述】:

假设我要声明一个类Game

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

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

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

【问题讨论】:

  • 呃,你试过@id = @generateNewGameId()吗?
  • @MariusKjeldahl @generateNewGameId() 是一种静态方法。如果它是实例方法,您提到的将起作用。

标签: class static coffeescript


【解决方案1】:

如果你真的想让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/

【讨论】:

  • 正是我想要的!
  • 值得看看@epidemian 的回答。这可能是大多数人正在寻找的。​​span>
【解决方案2】:

我认为您访问它的方式没问题。如果您出于某种原因不想写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 类中的私有变量。

【讨论】:

    猜你喜欢
    • 2011-10-22
    • 1970-01-01
    • 1970-01-01
    • 2016-08-28
    • 2018-09-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多