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