如何在Coffeescript中访问扩展类中的属性?

时间:2014-02-19 00:57:22

标签: javascript class if-statement coffeescript extends

我想在if语句中使用@Type,但好像它没有识别@Type。有没有办法获得@Type以便我可以在超类中使用它?

class opponent
    constructor: (ID, Level, Name) ->
        @ID = ID
        @Level = Level
        @Name = Name
        @Health = if @Level is 1
            @Level * 5 
        else if 2 <= @Level <= 4
            (@Level * 6) - (@Level * 2)  
        @Luck = if @Type is "Snake"
            Math.ceil(@Level * 1.25) + 5
        else
            Math.ceil(@Level * 1.25)
        @attackDamage = 0
        @defenseDoubled = false;
        @Poisoned = false;
        @Burned = false;
        @Frozen = false;

    @defend: ->
        @Defense *= 2
        @DefenseDoubled = true;
    @undefend: ->
        @Defense /= 2
        @DefenseDoubled = false;

class Snake extends opponent
    @Type: "Snake"

3 个答案:

答案 0 :(得分:1)

您可以使用constructor property

进入“课堂”
  

返回对创建实例原型的Object函数的引用。

因此如果s是蛇,那么s.constructor就是Snake。这意味着你可以做这样的事情:

class A
    m: -> console.log(@constructor.type)

class B extends A
    @type = 'B'

class C extends A
    @type = 'C'

(new B).m()
(new C).m()

并在控制台中获取'B''C'

演示:http://jsfiddle.net/ambiguous/bE6jh/

在您的特定情况下,您需要查看想知道类型的方法内的@constructor.Type

答案 1 :(得分:1)

这不回答你的问题(关于如何使子类属性对父类可见),但它应该产生相同的结果 - 以一种容易扩展的方式。您可以添加更多子类,而无需返回并每次更改opponent

class opponent
    constructor: (ID, Level, Name) ->
        @ID = ID
        @Level = Level
        @Name = Name
        @Health = if @Level is 1
            @Level * 5 
        else if 2 <= @Level <= 4
            (@Level * 6) - (@Level * 2)  
        @Luck = Math.ceil(@Level * 1.25)
        @attackDamage = 0
        # ...

class Snake extends opponent
    constructor : (ID, Level, Name) ->
      # use parent constructor to create the object
      # and then customize the values for this class
      super
      @Luck = Math.ceil(@Level * 1.25) + 5

答案 2 :(得分:0)

您的代码不起作用,因为在父类中,您引用的是实例变量@Type,但在 Snake 子类中,您正在定义一个类变量{{1 }}

要将@Type: "Snake"变量声明为实例变量,请在没有Type符号的情况下声明它:

@

要进一步扩展hpaulj的answer - 您总是希望保持代码DRY,因此计算@Luck属性的逻辑应仅在父类中定义。请考虑以下示例:

class Snake extends opponent
  Type: "Snake"