JavaScript类继承与构造函数实现Manager层级奖金计算问题
代码修正方案
- 构造函数参数缺失:Manager调用
super时未传入父类定义的boss参数,导致Manager实例无直属上司属性 - 实例化参数错误:将上司的字符串传入下属数组参数,下属需传入员工实例数组而非字符串
totalSubSalary逻辑失效:未实现薪资累加,遍历目标错误,实例类型判断位置错误bonus逻辑不匹配:Manager的奖金计算未关联下属总薪资
修正后可直接运行的完整代码:
class Employee { // 修正boss拼写,增加默认值适配无上司场景 constructor(name, salary, title, boss = null) { this.name = name; this.salary = salary; this.title = title; this.boss = boss; } // 普通员工奖金仅计算自身薪资乘乘数 bonus(multiplier) { return this.salary * multiplier; } } class Manager extends Employee { // 参数顺序:姓名、薪资、职位、直属上司实例、直属下属数组(默认空) constructor(name, salary, title, boss, subordinates = []) { // 将上司参数传给父类构造函数 super(name, salary, title, boss); // 存储直属下属实例数组(即原代码的employees属性,可按需改名) this.subordinates = subordinates; } // 递归计算所有层级下属的总薪资 totalSubSalary() { let total = 0; // 遍历直属下属数组 for (const sub of this.subordinates) { // 累加当前下属自身薪资 total += sub.salary; // 若当前下属是Manager实例,递归累加其下属的总薪资 if (sub instanceof Manager) { total += sub.totalSubSalary(); } } return total; } // Manager奖金规则:(自身薪资 + 所有下属总薪资) * 乘数 bonus(multiplier) { return (this.salary + this.totalSubSalary()) * multiplier; } } // 按层级顺序实例化,输出完全符合预期 let hobbes = new Employee("Hobbes", 1000000, "Founder", null); console.log(hobbes.bonus(0.05)); // 50000 let calvin = new Manager("Calvin", 130000, "Director", hobbes, []); console.log(calvin.bonus(0.05)); // 6500 let susie = new Manager("Susie", 100000, "TA Manager", calvin, []); let lily = new Employee("Lily", 90000, "TA", susie); let clifford = new Employee("Clifford", 90000, "TA", susie); // 将下属关联到Susie的直属列表 susie.subordinates.push(lily, clifford); console.log(susie.bonus(0.05)); // 14000 console.log(lily.bonus(0.05)); // 4500 console.log(clifford.bonus(0.05)); // 4500
关键逻辑说明
- *totalSubSalary()*采用递归实现:先累加当前Manager的直属下属薪资,若下属本身是Manager,就嵌套调用该下属的
totalSubSalary()方法,覆盖所有层级的下属薪资总和 - 实例化时需注意参数类型:上司、下属均需传入类实例,不能传入字符串
- 若后续需要让Calvin管理Susie,仅需执行
calvin.subordinates.push(susie)即可,Calvin的奖金会自动递归计算Susie及其下属的总薪资
内容的提问来源于stack exchange,提问作者Angelo
相关产品推荐
相关产品推荐

