原型链继承中父类构造函数仅在子类定义时执行一次,无法接收子类实例化时的参数,导致所有实例共享同一初始化状态;而借用构造函数通过call在每次实例化时调用父类,实现动态传参。

这个缺陷的本质在于:父类构造函数只在设置原型时执行一次,且是在子类定义阶段完成的,而不是在每次创建子类实例时运行。
为什么传不了参?
关键操作是这句:Child.prototype = new Parent()。它不是在 new Child() 时调用 Parent,而是在子类构造函数声明后、实例化前,就立即执行了一次 new Parent() —— 此时你根本还没拿到子类实例要传的参数,也没有执行环境去接收它们。
比如你想让每个子类实例带上自己的名字:new Child("Alice"),但 Parent 的 name 参数早在原型赋值那行就“固定”为默认值(如 undefined 或空字符串),后续实例无法再影响它。
实际表现是什么?
- 所有子类实例共享同一份父类构造函数执行结果,包括其初始化的属性值
- 即使子类构造函数接收了参数,也无法把它们转发给父类构造函数
- 想动态控制父类状态(如初始化不同
colors数组)完全做不到
对比借用构造函数就能看明白
在 function Child(name) { Parent.call(this, name); } 中,call 把 this 和 name 明确传进去了——每次 new Child("Tom") 都会重新调用 Parent,参数自然生效。而原型链继承里没有这个“每次调用”的环节。
立即学习“Java免费学习笔记(深入)”;
一句话总结
原型链继承的父类初始化是一次性、静态的,发生在子类“出生前”;而传参需求是动态的、实例级的,发生在子类“出生时”。两者时间点错位,导致参数无处安放。


















