JavaScript继承中参数传递必须在子构造函数内用Parent.call(this, ...args)显式调用父构造函数,因原型链继承(如Child.prototype=new Parent())会立即执行父构造函数且无法获取子类实例参数,导致初始化失效;组合继承需先call传参再Object.create设置原型并修正constructor;ES6中super(...args)是其语法糖。

JavaScript 继承中处理构造函数参数传递,关键在于**不能依赖原型链直接传参**,而必须在子构造函数内部显式调用父构造函数,并把参数正确绑定到当前实例上。
为什么原型链继承无法传参
原型链继承(如 Child.prototype = new Parent())会在设置原型时立即执行一次 Parent 构造函数。但此时没有实际的子实例上下文,也无法拿到子类创建时传入的参数(比如 new Child('Alice', 25) 中的 'Alice' 和 25)。所以父类的初始化逻辑要么被跳过,要么只能使用固定值,失去灵活性。
构造函数继承是传参的核心手段
通过 Parent.call(this, ...args),把父类构造函数当作普通函数执行,并将 this 指向新建的子实例,同时把参数原样传入。这样父类中定义的实例属性(包括引用类型)就能为每个子实例独立初始化。
-
支持任意参数顺序和数量:可解构、展开或按需选取,例如
Parent.call(this, name, ...hobbies) -
避免引用共享:每次调用都生成新数组/对象,如
this.hobbies = [...hobbies] -
与原型方法继承互补:它只负责实例属性,不干扰
Parent.prototype上的方法复用
组合继承中参数传递的典型写法
完整继承需兼顾实例属性和原型方法。参数传递只发生在构造函数调用环节,原型链设置本身不涉及参数:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
立即学习“Java免费学习笔记(深入)”;
- 子构造函数内第一句就调用
Parent.call(this, name, age) - 原型链用
Object.create(Parent.prototype)设置,不执行Parent构造函数 - 手动修复
constructor:Child.prototype.constructor = Child
这样既保证每个 Child 实例拥有自己的一份 name、age 和私有 hobbies 数组,又能调用 Parent.prototype.sayHi() 等共享方法。
ES6 class 的写法更直观
使用 class 语法时,super(...args) 就是专为参数传递设计的语法糖,本质仍是 Parent.call(this, ...args):
- 必须在子类
constructor中首行调用super(),否则报错 - 参数直接透传,无需手动绑定
this - 原型链自动建立,
constructor自动修正

















