热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

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
}

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

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


推荐阅读
  • 本文讨论了在openwrt-17.01版本中,mt7628设备上初始化启动时eth0的mac地址总是随机生成的问题。每次随机生成的eth0的mac地址都会写到/sys/class/net/eth0/address目录下,而openwrt-17.01原版的SDK会根据随机生成的eth0的mac地址再生成eth0.1、eth0.2等,生成后的mac地址会保存在/etc/config/network下。 ... [详细]
  • Java学习笔记之面向对象编程(OOP)
    本文介绍了Java学习笔记中的面向对象编程(OOP)内容,包括OOP的三大特性(封装、继承、多态)和五大原则(单一职责原则、开放封闭原则、里式替换原则、依赖倒置原则)。通过学习OOP,可以提高代码复用性、拓展性和安全性。 ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • 本文介绍了iOS数据库Sqlite的SQL语句分类和常见约束关键字。SQL语句分为DDL、DML和DQL三种类型,其中DDL语句用于定义、删除和修改数据表,关键字包括create、drop和alter。常见约束关键字包括if not exists、if exists、primary key、autoincrement、not null和default。此外,还介绍了常见的数据库数据类型,包括integer、text和real。 ... [详细]
  • Oracle seg,V$TEMPSEG_USAGE与Oracle排序的关系及使用方法
    本文介绍了Oracle seg,V$TEMPSEG_USAGE与Oracle排序之间的关系,V$TEMPSEG_USAGE是V_$SORT_USAGE的同义词,通过查询dba_objects和dba_synonyms视图可以了解到它们的详细信息。同时,还探讨了V$TEMPSEG_USAGE的使用方法。 ... [详细]
  • Java太阳系小游戏分析和源码详解
    本文介绍了一个基于Java的太阳系小游戏的分析和源码详解。通过对面向对象的知识的学习和实践,作者实现了太阳系各行星绕太阳转的效果。文章详细介绍了游戏的设计思路和源码结构,包括工具类、常量、图片加载、面板等。通过这个小游戏的制作,读者可以巩固和应用所学的知识,如类的继承、方法的重载与重写、多态和封装等。 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 本文介绍了在rhel5.5操作系统下搭建网关+LAMP+postfix+dhcp的步骤和配置方法。通过配置dhcp自动分配ip、实现外网访问公司网站、内网收发邮件、内网上网以及SNAT转换等功能。详细介绍了安装dhcp和配置相关文件的步骤,并提供了相关的命令和配置示例。 ... [详细]
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • 本文介绍了一个Java猜拳小游戏的代码,通过使用Scanner类获取用户输入的拳的数字,并随机生成计算机的拳,然后判断胜负。该游戏可以选择剪刀、石头、布三种拳,通过比较两者的拳来决定胜负。 ... [详细]
  • 阿,里,云,物,联网,net,core,客户端,czgl,aliiotclient, ... [详细]
  • 本文介绍了Java高并发程序设计中线程安全的概念与synchronized关键字的使用。通过一个计数器的例子,演示了多线程同时对变量进行累加操作时可能出现的问题。最终值会小于预期的原因是因为两个线程同时对变量进行写入时,其中一个线程的结果会覆盖另一个线程的结果。为了解决这个问题,可以使用synchronized关键字来保证线程安全。 ... [详细]
  • 怀疑是每次都在新建文件,具体代码如下 ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
author-avatar
shadow
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有