CoffeeScript — как мне получить свойство статического массива в классе

#javascript #inheritance #coffeescript

#javascript #наследование #coffeescript

Вопрос:

Я только начал изучать CoffeeScript, и я хотел бы знать, какова наилучшая практика для получения статического свойства в классе из дочернего экземпляра.

 class Mutant
    MutantArray: []

    constructor: (@name, @strength = 1, @agility = 1) ->
        @MutantArray.push(@name)

    attack: (opponent) ->
        if opponent in @MutantArray then console.log @name   " is attacking "   opponent else console.log "No Mutant by the name of '"   opponent   "' found."


    @getMutants: () ->
        # IS THIS RIGHT?
        console.log @.prototype.MutantArray

Wolverine = new Mutant("Wolverine", 1, 2)
Rogue = new Mutant("Rogue", 5, 6)

Rogue.attack("Wolverine")

Mutant.getMutants()
 

Я бы хотел, чтобы мой метод getMutants() был статическим (создание экземпляра не требуется) и возвращал список имен мутантов, которые были созданы. @.prototype.Похоже, что MutantArray работает нормально, но есть ли лучший способ сделать это? Я попробовал @MutantArray, но это не сработало.

Спасибо!

Ответ №1:

Я думаю, вам следует определить свой MutantArray как статическое поле. Затем из нестатических методов вы должны ссылаться на него через class, а из статических методов вы получаете к нему доступ через @ . Вот так:

 class Mutant
    @MutantArray: []

    constructor: (@name, @strength = 1, @agility = 1) ->
         Mutant.MutantArray.push(@name)

    attack: (opponent) ->
        if opponent in Mutant.MutantArray then console.log @name   " is attacking "   opponent else console.log "No Mutant by the name of '"   opponent   "' found."


    @getMutants: () ->
        # IS THIS RIGHT?
        console.log @MutantArray
 

Ответ №2:

Я думаю, что это так:

 class Mutant
    MutantArray: []

    constructor: (@name, @strength = 1, @agility = 1) ->
        @MutantArray.push(@name)

    attack: (opponent) ->
        if opponent in @MutantArray then console.log @name   " is attacking "   opponent else console.log "No Mutant by the name of '"   opponent   "' found."


    getMutants: () ->
        # IS THIS RIGHT?
        console.log @.MutantArray

Wolverine = new Mutant("Wolverine", 1, 2)
Rogue = new Mutant("Rogue", 5, 6)

Rogue.attack("Wolverine")

Mutant.getMutants()
 

getMutants должен быть методом-прототипом, и вы извлекаете значение массива с помощью @.getMutants