繁体   English   中英

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

[英]How to access property in extended class in Coffeescript?

我想在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"

您可以使用constructor属性访问 “类”:

返回对创建实例原型的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

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

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

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

class Snake extends opponent
  Type: "Snake"

为了进一步扩展hpaulj的答案 - 你总是希望保持你的代码DRY,所以计算@Luck属性的逻辑应该只在父类中定义。 请考虑以下示例:

class opponent
  constructor: ( args... ) ->
  # ... your logic
  @Luck = Math.ceil(@Level * 1.25) + ( @LuckFactor? or 0 )

class Snake extends opponent
  LuckFactor: 5

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM