如何为技能等级0-10创建同结构不同值的属性集,避免重复代码?
技能等级配置实现方案
一、避免重复复制,快速生成0-10级统一结构
1. 工厂函数方案(最常用)
先写一个生成单等级配置的函数,再循环创建0到10级的配置,每个等级都是独立对象,互不影响:
// 生成单个等级配置的工厂函数 function createLevelConfig() { return { skillPoints: 0, mp: 0, attackPower: 0, effect: 0, requiredLevel: 0, castTime: { fixed: 0, variable: 0, total: 0 }, cooldown: { fixed: 0, variable: 0, total: 0, }, duration: 0, attackEnemyNumber: 0, description: '' }; } // 初始化完整技能配置 const skillProps = { name: 'N/A', skillType: 'N/A', level: {}, weaponType: '', posX: 0, posY: 0 }; // 循环生成0-10级的配置 for (let i = 0; i <= 10; i++) { skillProps.level[i] = createLevelConfig(); }
2. 类封装方案(适合后续扩展逻辑)
如果之后需要给等级配置加计算逻辑(比如自动算总施法时间),用类更方便:
class LevelConfig { constructor() { this.skillPoints = 0; this.mp = 0; this.attackPower = 0; this.effect = 0; this.requiredLevel = 0; this.castTime = { fixed: 0, variable: 0, total: 0 }; this.cooldown = { fixed: 0, variable: 0, total: 0, }; this.duration = 0; this.attackEnemyNumber = 0; this.description = ''; } // 示例:自动计算总施法时间 updateTotalCastTime() { this.castTime.total = this.castTime.fixed + this.castTime.variable; } } // 初始化技能配置 const skillProps = { name: 'N/A', skillType: 'N/A', level: {}, weaponType: '', posX: 0, posY: 0 }; for (let i = 0; i <= 10; i++) { skillProps.level[i] = new LevelConfig(); }
3. 模板+深拷贝方案(简洁写法)
先定义基础模板,再通过深拷贝生成每个等级的配置,避免嵌套对象共享引用:
// 基础等级模板 const levelTemplate = { skillPoints: 0, mp: 0, attackPower: 0, effect: 0, requiredLevel: 0, castTime: { fixed: 0, variable: 0, total: 0 }, cooldown: { fixed: 0, variable: 0, total: 0, }, duration: 0, attackEnemyNumber: 0, description: '' }; // 深拷贝函数,确保嵌套对象独立 function deepCopy(obj) { return JSON.parse(JSON.stringify(obj)); } // 初始化技能配置 const skillProps = { name: 'N/A', skillType: 'N/A', level: {}, weaponType: '', posX: 0, posY: 0 }; for (let i = 0; i <= 10; i++) { skillProps.level[i] = deepCopy(levelTemplate); }
二、常量对象是否合适?
完全合适:
const只是禁止变量被重新赋值,但对象内部的属性(比如skillProps.level[1].attackPower)依然可以自由修改,刚好满足你“各等级属性独立调整”的需求。- 如果你的技能配置是作为基础模板使用,不需要整体替换,用
const定义更符合语义,避免误操作覆盖整个配置对象。 - 要是后续需要生成多个不同技能的配置,把上述逻辑封装成函数/类,每次调用生成新对象即可,不会有引用冲突问题。
内容的提问来源于stack exchange,提问作者Gaukh
相关产品推荐
相关产品推荐

