You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Udacity ES6课程:重写Vehicle基类构造函数的Bicycle子类问题

问题分析与修复方案

咱们来一步步拆解你的Bicycle子类代码没通过检测的原因,以及怎么修复:

核心问题点

  1. 构造函数参数顺序与父类不匹配
    父类Vehicle的构造函数参数顺序是color, wheels, horn,但你的子类构造函数参数是wheels, horn,调用super(wheels, horn)时,相当于把wheels的值传给了父类的color参数,horn传给了父类的wheels参数,父类的horn参数则变成了undefined——这直接导致color的默认值完全失效。

  2. 未给所有参数设置默认值
    检测要求子类构造函数要为color, wheels, horn都设置默认值,但你的代码里:

    • 没有color参数,自然没法保留父类的默认蓝色;
    • wheels和horn也没设置默认值,当你创建无参实例时,这两个参数会是undefined,虽然你之后手动赋值了,但此时父类的构造逻辑已经错误执行,而且color已经变成了undefined,不符合默认值要求。
  3. 没必要手动覆盖属性
    你在super之后手动给this.wheels和this.horn赋值,其实完全可以通过super直接传递正确的默认值来完成初始化,这样更符合类继承的规范。

修复后的正确代码

class Bicycle extends Vehicle {
  // 保留color参数并继承父类默认值,同时修改wheels和horn的默认值
  constructor(color = 'blue', wheels = 2, horn = 'honk honk') {
    // 严格按照父类参数顺序传递
    super(color, wheels, horn);
  }

  // 如果honkHorn方法的逻辑和父类完全一致,这个重写可以省略
  honkHorn() {
    super.honkHorn();
  }
}

验证效果

  • 当你创建无参实例const bike = new Bicycle()时,bike.color是'blue',bike.wheels是2,bike.horn是'honk honk',完全符合检测要求;
  • 如果你需要自定义属性,比如const redBike = new Bicycle('red', 3),此时redBike.color是'red',wheels是3,horn依然保持默认的'honk honk',灵活性也没问题。

内容的提问来源于stack exchange,提问作者Edwin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.12 05:05:12