javascript中extends仅建立继承关系,参数传递和默认值由super()调用及父类构造函数决定;子类必须显式调用super()并传参,且super()须在访问this前执行,父类默认参数仅在传undefined时生效。

JavaScript 中 extends 关键字本身不处理参数,也不提供默认参数机制;它只是建立类之间的继承关系。真正涉及参数传递和默认值的,是子类构造函数中对 super() 的调用方式,以及父类构造函数本身的参数设计。
子类构造函数必须显式调用 super()
extends 后,子类构造函数不会自动调用父类构造函数,也不会自动转发参数。你必须手动写 super(...args),且必须在访问 this 前执行:
class Animal {
constructor(name = 'anonymous', age = 0) {
this.name = name;
this.age = age;
}
}
class Dog extends Animal {
constructor(name, breed) {
// ❌ 错误:没传参,父类会收到 undefined, undefined
// super();
// ✅ 正确:显式传参,可利用父类默认值
super(name); // age 使用父类默认值 0
// ✅ 或完全自定义
// super(name || 'dog', 1);
this.breed = breed;
}
}
父类默认参数由父类构造函数决定
super() 调用时传入什么,父类就接收什么。父类内部的默认参数(如 name = 'unknown')照常生效,但前提是:
- 你传了
undefined或者没传该位置参数; - 不能传
null或空字符串等“假值”——它们不会触发默认值。
class Person {
constructor(firstName = 'John', lastName = 'Doe') {
this.fullName = `${firstName} ${lastName}`;
}
}
class Student extends Person {
constructor(firstName, grade) {
// 传 undefined → 触发 lastName 默认值
super(firstName, undefined); // fullName: "Alice Doe"
// 传 null → 不触发默认,lastName 就是 null
// super(firstName, null); // fullName: "Alice null"
this.grade = grade;
}
}
常见错误:试图让 extends 自动透传参数
extends 不支持类似 Python 的 *args, **kwargs 自动转发。以下写法无效:
class BadExample extends Parent {
constructor(...args) {
super(...args); // ✅ 这行语法合法,但不是 extends 的功能,而是你手动展开
}
}
注意:super(...args) 是你主动写的逻辑,不是 extends 提供的能力。ES6 没有“自动继承参数签名”的机制。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
实用建议:统一参数策略
-
若子类与父类参数高度一致,可直接解构或重命名后透传:
constructor({ name, type, id } = {}) { super(name); // 只传需要的 this.type = type; this.id = id ?? Math.random(); } 若父类参数多、子类只关心部分,明确传参比盲目展开更安全;
避免
super(...arguments)—— 它容易把多余参数也传进去,导致父类报错或行为异常。
不复杂但容易忽略:extends 只管“连原型”,参数怎么传、传什么、用不用默认值,全由你写在 super() 里的那行代码决定。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










