1. 主页 > 好文章

JS子类构造函数中调用父类方法示例:避免常见错误

哎哟喂!你是不是遇到过这种情况:明明照着教程写了类继承,结果一运行就报错?控制台蹦出一堆红字说什么"Must call super constructor...",看得人直挠头?别慌,今天咱们就来唠唠这个让无数新手摔跟头的经典问题!


一、为啥非得在子类里调用super?

??举个栗子??:想象你正在造一辆汽车(子类),但必须得先有发动机(父类)才能启动。在JS里,子类构造函数中的super()就是这个装发动机的过程。

javascript复制
// 错误示范:直接造汽车不装发动机
class Engine {
  constructor(power) {
    this.power = power
  }
}

class Car extends Engine {
  constructor(color) {
    // ? 忘记super直接给车上色
    this.color = color
  }
}
// 报错:ReferenceError: Must call super constructor...

// 正确姿势:先装发动机再喷漆
class CorrectCar extends Engine {
  constructor(power, color) {
    super(power)  // ? 先装发动机!
    this.color = color
  }
}

??你品你细品??:子类就像改装车厂,得先拿到父类的完整配置(通过super)才能继续改装。这可不是JS故意刁难人,而是为了保证继承链条不断裂。


二、三大作死操作排行榜

① 不按顺序调用super

你以为把super随便扔哪都行?天真!看这个游戏角色继承的翻车现场:

javascript复制
class Character {
  constructor(name) {
    this.name = name
    this.hp = 100
  }
}

class Mage extends Character {
  constructor(name, mana) {
    this.weapon = "法杖" // ? 顺序颠倒
    super(name)
    this.mana = mana
  }
}
// 报错:ReferenceError: Must call super constructor...

??救命锦囊??:记住这个口诀——super要当排头兵,this操作在后头。就像吃火锅得先点火,总不能菜都下锅了才发现没开煤气吧?


② 参数传递对不上号

新手最容易掉的坑:父类要3个参数,子类只传2个。这就像给手机充电只插了数据线没接电源:

javascript复制
class Phone {
  constructor(brand, os) {
    this.brand = brand
    this.os = os
  }
}

class SmartPhone extends Phone {
  constructor(model) {
    super(model) // ? 参数数量不匹配
    this.features = ["全面屏", "5G"]
  }
}
// 父类需要brand和os,这里只传了model

??避坑指南??:父类要啥就给啥,参数类型别瞎改。建议用VS Code这类带参数提示的编辑器,就像点菜时看菜单配图,不容易点错单。


③ 多层继承连环坑

当爷爷类、爸爸类、儿子类三代同堂时,问题就更复杂了。比如这个电商系统的用户体系:

javascript复制
class User {
  constructor(account) {
    this.account = account
  }
}

class VipUser extends User {
  constructor(account, level) {
    super(account)
    this.level = level
  }
}

class SuperVip extends VipUser {
  constructor(account) { // ? 漏传level参数
    super(account)
    this.badge = "黄金徽章"
  }
}
// 报错:新建SuperVip时需要传level参数

??破局关键??:继承链就像传话游戏,每一环都不能掉链子。建议画个继承关系图,就像地铁线路图那样清楚明了。


三、正确姿势对照表

错误类型错误示例正确写法类比场景
super顺序错误先写this.color再写supersuper在前,this操作在后先穿袜子再穿鞋
参数数量不对super(只传部分参数)super(完整参数)做菜按食谱放配料
多层继承参数遗漏孙类构造函数漏传父类参数逐层传递必要参数接力赛传好接力棒

四、个人踩坑心得

当年我刚学类继承那会儿,总觉得这个super是多此一举。直到有次做项目,因为漏写super导致整个用户系统崩了,才明白这玩意就像汽车的安全带——平时觉得碍事,出事时才知道能救命。

有个冷知识你可能不知道:其实super在不同地方有不同用法。在构造函数里是super(),在普通方法里是super.method()。这就好比螺丝刀的一字头和十字头,用对了地方才好使。

最后说句掏心窝的话:理解super的本质,比死记硬背语法更重要。它不仅仅是调用父类构造函数的工具,更是维系类继承关系的纽带。就像人类社会中的代际传承,没有上一代的积累,哪来下一代的创新呢?

本文由嘻道妙招独家原创,未经允许,严禁转载