寄生组合式继承完全支持构造函数参数传递,关键在于子类构造函数内用parent.call(this, ...args)显式调用父类构造函数,原型链通过object.create(parent.prototype)建立而不执行父构造函数,确保参数精准可控、无冗余调用。

寄生组合式继承完全支持构造函数参数传递,关键在于把 父类构造函数调用 放在子类构造函数内部,用 Parent.call(this, ...args) 实现。
参数传递发生在子类构造函数中
与原型链继承不同,寄生组合式继承不依赖 new Parent() 创建原型对象,因此不会干扰参数流程。所有传参逻辑由子类构造函数自主控制:
- 子类构造函数接收任意参数(如
name,age,options) - 显式调用
Parent.call(this, name),将需要继承的实例属性参数传入父类 - 剩余参数可直接用于初始化子类自身属性(如
this.age = age)
避免参数被忽略或丢失
因为原型链建立(Object.create(Parent.prototype))完全不执行父类构造函数,所以不会像组合继承那样“悄悄调用一次父构造函数却传空参”。所有参数都由开发者精确控制:
- 父类构造函数只执行一次,且只在子类实例化时触发
- 传参内容与子类调用时一致,无隐式默认值覆盖风险
- 支持解构、展开运算符等现代写法,例如:
Parent.call(this, ...args.slice(0, 2))
实际例子中的参数流向
以常见父子结构为例:
function Person(name, job) {this.name = name;
this.job = job;
this.skills = ['HTML'];
}
function Developer(name, job, level) {
// ✅ 正确传参:只把 name 和 job 交给父类
Person.call(this, name, job);
this.level = level; // ✅ 子类专属参数
}
Developer.prototype = Object.create(Person.prototype);
Developer.prototype.constructor = Developer;
创建实例 new Developer('Alice', 'Engineer', 'Senior') 时:
→ name 和 job 进入 Person.call,初始化 this.name 和 this.job;
→ level 直接赋给子类实例,不经过父类。











