我正在用JavaScript上课。我想创建2个用户,每个用户都有一个武器,然后在班级内部创建一个功能来攻击每个玩家,并通过各自的武器伤害来降低其生命值。我正在尝试在3个不同的文件中执行此操作,我要做的就是将User类与Gun类合并,以将武器归于用户。但是我不知道该怎么做。我想要这样的东西:

let John = new User("John", "Sniper);
let Michael = new User("Michael", "Shotgun");

John.attack("Michael");



然后我想在类中创建附加功能很有趣,但是首先我需要弄清楚如何在User类中为用户添加武器:)

我想提供我尝试过的内容,但我找不到解决方法..

main.js

import Gun from '/js/gun.js';
import User from '/js/user.js';

let players = [ new User("Mic", "sniper"), new User("AI", "rifle") ];

players[0].shootAt(players[1]);
players[1].shootAt(players[0]);



user.js

export default class User{
    constructor(userName, Gun){
        this.name = userName;
        this.health = 50;
        console.log(this.name + ' was created with ' + this.health + ' health');
    }

    shootAt(target){
        target.health -= gun.damage;
    }
}


gun.js



export default class Gun{
    constructor(){
        this.sniper = {
            damage : 150,
            magazine : 7,
            fireRate : 1.5
        }
        this.rifle = {
            damage : 25,
            magazine : 30,
            fireRate : .05
        }
    }

}


这不起作用:

let players = [ new User("Mic", "sniper"), new User("AI", "rifle") ];

players[0].shootAt(players[1]);
players[1].shootAt(players[0]);



但这是我要寻找的结果。请帮助!

最佳答案

您看到的问题是因为您实际上没有在创建带有任何属性的新Gun对象,而只是将字符串传递给User类,并且无法从gun类访问属性。

对于Gun类,您需要确保可访问项目,并且记住枪支类型。您需要在gunType中添加类似Gun属性的内容,然后在User中将其枪支也存储在属性中。

看下面的代码,我为Gun属性添加了一些基本的吸气剂,这些吸气剂使用gunType检索当前枪支的数据。如果您使用不支持的类型,它将下降,因此您需要按照Poliwhril先生的建议扩展该区域或通过扩展Gun类来创建枪支类型。然后,我将新的Gun对象传递给User对象,并将它们存储在gun属性中,以备后用。

class User{
    constructor(userName, Gun){
        this.name = userName;
        this.health = 50;
        this.gun = Gun;
        console.log(this.name + ' was created with ' + this.health + ' health');
    }

    shootAt(target){
        target.health -= this.gun.damage;
    }
}

class Gun{
    constructor( gunType ){
        this.sniper = {
            damage : 150,
            magazine : 7,
            fireRate : 1.5
        }
        this.rifle = {
            damage : 25,
            magazine : 30,
            fireRate : .05
        }

        this.gunType = gunType;
    }

    get damage() {
        return this[ this.gunType ].damage;
    }
    get magazine() {
        return this[ this.gunType ].magazine;
    }
    get fireRate() {
        return this[ this.gunType ].fireRate;
    }

}


players = [ new User("Mic", new Gun( "sniper") ), new User("AI", new Gun( "rifle" ) ) ];

09-15 12:00