Oop TypeScript使用实例访问静态变量

Oop TypeScript使用实例访问静态变量,oop,typescript,Oop,Typescript,因此,在大多数OOP语言中,静态变量也可以称为类变量,即它们的值在该类的所有实例中共享。例如,在我的游戏中,我有一个类Bullet,它由GreenBullet和PinkBullet扩展。我希望这些子类有一个名为ammo的“class”或“static”变量,以便跟踪特定弹药类型的弹药数量。但关键是:我希望能够通过子类的实例访问这个属性 例如: var bullet: GreenBullet = new GreenBullet() if (bullet.ammo <= 0) retu

因此,在大多数OOP语言中,静态变量也可以称为变量,即它们的值在该类的所有实例中共享。例如,在我的游戏中,我有一个类
Bullet
,它由
GreenBullet
PinkBullet
扩展。我希望这些子类有一个名为
ammo
的“class”或“static”变量,以便跟踪特定弹药类型的弹药数量。但关键是:我希望能够通过子类的实例访问这个属性

例如:

var bullet: GreenBullet = new GreenBullet()
if (bullet.ammo <= 0)
    return;
bullet.shoot();
bullet.ammo --;
var-bullet:GreenBullet=new-GreenBullet()

如果(bullet.ammo第一个选项是创建静态变量的实例访问器:

class GreenBullet
{
   static ammo: number = 0;
   get ammo(): number { return GreenBullet.ammo; }
   set ammo(val: number) { GreenBullet.ammo = val; }
}
var b1 = new GreenBullet();
b1.ammo = 50;
var b2 = new GreenBullet();
console.log(b2.ammo); // 50
如果您希望子弹的所有子类(包括自身)都有单独的弹药计数,您可以这样做:

class Bullet
{
   static ammo: number = 0;
   get ammo(): number { return this.constructor["ammo"]; }
   set ammo(val: number) { this.constructor["ammo"] = val; }
}
class GreenBullet extends Bullet { }
class PinkBullet extends Bullet { }

var b1 = new GreenBullet();
b1.ammo = 50;
var b2 = new GreenBullet();
console.log(b2.ammo); // 50
var b3 = new PinkBullet();
console.log(b3.ammo); // 0

顺便说一句,我很确定你不应该把子弹数存储在一个静态变量中。

这是一个很好的使用单独静态成员的技巧。你是如何让“this.constructor.ammo”编译的?转换到任何?@MichaelS that或做
this.constructor[“ammo”]
。另外,我建议将
静态弹药
设为私有,因为不需要任何类外的东西来访问它。