构造函数继承天然不继承父类原型属性和方法,仅通过Parent.call(this)复制实例属性;若需原型方法,须额外处理,如手动绑定或改用组合继承。

构造函数继承本身就不会继承父类原型上的属性和方法——这是它的设计特点,不是需要“避免”的问题,而是天然如此。
为什么构造函数继承不涉及原型
它只在子类构造函数内部调用 Parent.call(this, ...),把父类中挂载在 this 上的实例属性(比如 this.name、this.colors = [])复制到当前子类实例上。父类原型链上的东西(如 Parent.prototype.sayName)根本不会被访问或绑定。
如果你想要原型方法,得额外处理
单纯靠构造函数继承,子类实例无法调用父类原型方法。这不是缺陷,而是职责分离:它专注解决实例属性独立性问题。若需复用方法,必须配合其他机制:
- 把共用方法也写进父类构造函数里(不推荐,破坏复用性)
- 手动把父类原型方法挂到子类实例上(如
this.sayName = Parent.prototype.sayName.bind(this)) - 改用组合继承或寄生组合式继承,在继承实例属性的同时,再让子类原型指向父类原型(常用且推荐)
常见误解澄清
有人误以为“没继承到原型方法”是 bug,其实这是构造函数继承的明确行为。它要的就是:每个实例独享属性,不共享引用,也不依赖原型链查找。如果你发现子类意外拥有了父类原型方法,大概率是后续代码误操作了原型(例如又执行了 Child.prototype = new Parent()),而不是构造函数继承本身导致的。
立即学习“Java免费学习笔记(深入)”;
一句话总结
构造函数继承天生隔离原型,它只拿 this 上的东西;想用原型方法,就得另外搭桥——要么手动赋值,要么换更完整的继承方案。


















