JavaScript类构造器数量疑问及代码实现合理性咨询
问题解答
1. 你的Actor对象中是否使用了构造器?
没有。JavaScript里的构造器是指用于初始化对象的特殊函数——要么是ES5里用new调用的构造函数,要么是ES6 class语法里的constructor方法。你代码里的primaryStats、primaryStatsBase、primaryStatsCap都是普通的实例方法,不是构造器。
你当前创建对象用的是Object.create,这种方式是直接基于原型对象创建新对象,不会触发任何构造器逻辑,所有属性都是你手动调用方法后才添加到实例上的。
2. 如果是,是否使用了三个构造器?
既然没有构造器,自然不存在“三个构造器”的说法。那三个方法只是普通的属性设置函数,和构造器的本质(对象创建时自动执行的初始化逻辑)完全不同。
3. 如果没有,我是否应该使用构造器,还是当前写法可行?
当前写法是可行的,但有一些可以优化的点:
- 优点:灵活,你可以在对象创建后的任意时机调用这些方法来设置属性,甚至可以多次修改。
- 缺点:容易出现属性缺失——如果创建角色后忘了调用某个方法,实例就会缺少对应的属性,可能导致后续逻辑出错。
如果想更符合JavaScript的面向对象范式,推荐用class(或构造函数)来整合初始化逻辑,同时可以用静态工厂方法来实现类似“多构造器”的效果(因为class确实只能有一个constructor,但静态方法可以封装不同的初始化逻辑):
示例代码:
class Actor { // 主构造器,整合所有属性的初始化 constructor(stats, baseStats, capStats) { // 设置当前属性 this.level = stats.level; this.hp = stats.hp; this.balance = stats.balance; this.exp = stats.exp; // 设置基础属性(比如初始值) this.levelbase = baseStats.level; this.hpbase = baseStats.hp; this.balancebase = baseStats.balance; this.expbase = baseStats.exp; // 设置属性上限 this.levelcap = capStats.level; this.hpcap = capStats.hp; this.balancecap = capStats.balance; this.expcap = capStats.exp; } // 静态工厂方法:快速创建默认人类角色 static createHuman() { const defaultStats = { level: 1, hp: 9000, balance: 100, exp: 1 }; return new Actor(defaultStats, defaultStats, defaultStats); } // 静态工厂方法:创建高血量矮人角色 static createDwarf() { const stats = { level: 1, hp: 12000, balance: 80, exp: 1 }; const baseStats = { level: 1, hp: 12000, balance: 80, exp: 1 }; const capStats = { level: 50, hp: 50000, balance: 300, exp: 100000 }; return new Actor(stats, baseStats, capStats); } } // 使用方式 const human = Actor.createHuman(); const dwarf = Actor.createDwarf();
如果想保留你当前的原型链写法,也可以给Actor添加一个初始化方法,在创建实例后统一调用,避免遗漏:
let Actor = { primaryStats: function (level, hp, balance, exp){ this.level = level; this.hp = hp; this.balance = balance; this.exp = exp; }, primaryStatsBase: function (levelbase, hpbase, balancebase, expbase){ this.levelbase = levelbase; this.hpbase = hpbase; this.balancebase = balancebase; this.expbase = expbase; }, primaryStatsCap: function(levelcap, hpcap, balancecap, expcap){ this.levelcap = levelcap; this.hpcap = hpcap; this.balancecap = balancecap; this.expcap = expcap; }, // 统一初始化方法 init: function(level, hp, balance, exp) { this.primaryStats(level, hp, balance, exp); this.primaryStatsBase(level, hp, balance, exp); this.primaryStatsCap(level, hp, balance, exp); } }; // 创建实例后直接调用init let human = Object.create(Actor); human.init(1, 9000, 100, 1);
内容的提问来源于stack exchange,提问作者Shawn
相关产品推荐
相关产品推荐

