编程语言
首页 > 编程语言> > javascript-如何在类静态方法中创建对象

javascript-如何在类静态方法中创建对象

作者:互联网

我开始学习有关类中静态方法的更多信息,并且想知道以下操作是否可行:

>设置一个实例化怪物的类(怪物{…}类)
>允许某人通过传递他们希望怪物拥有的所有属性来创建怪物实例
>有一个静态方法(Monster.create()),该方法将生成一个新的Monster实例并随机分配属性,而不是要求这些值作为输入.

我的问题:
1.这是一种可怕的方法吗?如果不,
2.如何在static方法中创建一个新实例?

我的第一个想法是,您可以让静态方法返回一个对象,然后执行您想使该对象的值随机化的任何逻辑,但是我不确定是否有更好的方法. (我认为该对象将不在使用新Monster(…)创建的实例的原型链之外?)

这是我第一次尝试时想到的结果,但这势在必行地创建了Monster,模仿Monster类:

class Monster {
    constructor(hp) {
        this.hp = hp;
    }

    static create() {
        const obj = Object.create(Monster.prototype);
        obj.hp = Math.floor(Math.random() * 100);
        return obj;
    }

    attack(obj) {
        const randDamage = Math.floor(Math.random() * 10);
        console.log(`Monster deals ${randDamage} damage!`);
        obj.hp -= randDamage;
    }
}


const monster = Monster.create();
const me = {hp: 100};
monster.attack(me);
console.log(me);  // { hp: 91 }

有没有一种方法可以实现使用Monster类的create()?还是这是正确的方法?

解决方法:

返回对象实例的函数通常称为“工厂函数”.对于某些类型的对象,这是一种常见的设计模式.

对于您正在做的事情,您有两种选择:

>您可以创建一个工厂函数,该函数创建并返回以某种方式或随机方式预先设置的对象.
>您可以创建一个构造函数变量(可以传递给构造函数的一组参数),该变量将导致它创建所需对象的类型和配置.

这两种方法都可以很好地工作.

Is this a terrible approach to doing this?

不可以.工厂功能是一种完全合理的处理方式.通常,我首先会考虑让构造函数为您完成工作,而不使用工厂函数,但是有时有充分的理由收集以某种方式将对象构建为工厂函数的特定序列而不是构造函数.

How do you create a new instance inside the static method?

您就像在其他任何地方一样使用new.

Is there a way to implement create() that uses the Monster class?

是.您只需在静态方法中使用new来创建对象.

// since your constructor already accepts an hp parameter as an argument
// you can just create a random hp value and pass it to the constructor
static create() {
    let hp = Math.floor(Math.random() * 100);
    return new Monster(hp);
}

但是,您也可以只修改构造函数,以便如果不传递任何参数,则构造函数本身会为其创建一个随机值,并且完全不使用静态工厂函数:

class Monster {
    constructor(hp) {
        if (hp === undefined) {
            this.hp = Math.floor(Math.random() * 100);
        } else {
            this.hp = hp;
        }
    }

    // rest of class definition here

}

然后,只需使用构造函数创建您的对象:

// create monster object with random hp value
const monster = new Monster();

或者,如果您的参数足够简单,则可以使用ES6默认值:

class Monster {
    // supply default value for hp parameter if not present
    constructor(hp = Math.floor(Math.random() * 100)) {
        this.hp = hp;
    }
}

Allow someone to create a monster instance by passing all the properties they want the monster to have

通常,这是通过将一个对象传递给构造函数来完成的,无论该对象上存在什么属性,这些属性都用于初始化该对象的功能.如果传递给构造函数的对象上没有属性,则构造函数将使用默认值.

class Monster {
    constructor(options) {
        if (options.hp === undefined) {
            this.hp = Math.floor(Math.random() * 100);
        } else {
            this.hp = options.hp;
        }
        // similar logic can be used for other properties on the options object

    }

    // rest of class definition here

}

此示例显示了检查对象上每个特定属性的代码,但是通过将传入对象上的所有属性复制到新创建的对象上,或者通过创建属性名称白名单并复制两个属性中存在的任何属性,这也可以有些自动化.白名单和对象上.

或者,可以将传入的对象与属性的一组默认值合并,然后合并到新对象中.有许多方法可以执行此操作,具体取决于您拥有哪些特定属性以及是否希望对它们进行处理.

标签:ecmascript-6,static-methods,javascript,class,object
来源: https://codeday.me/bug/20191110/2015134.html