JavaScript继承基于原型链而非类,核心是[[Prototype]]链接和prototype属性;原型链继承共享方法但属性共享有缺陷,构造函数继承解决属性独立但无法复用方法,组合继承兼顾二者但父构造函数调用两次且需修复constructor。

JavaScript 继承不是靠“类”定义出来的,而是靠对象之间的原型链接实现的。核心在于:每个对象都有一个内部链接([[Prototype]]),指向它的原型对象;而函数的 prototype 属性,就是将来被这个函数创建的实例所共用的原型对象。
原型链继承:最基础的实现方式
让子构造函数的 prototype 指向父构造函数的一个实例,就能建立继承关系。
- 子类实例能访问父类原型上的方法(如
sayName()) - 所有子类实例共享父类实例中的引用类型属性(比如数组、对象),修改一个会影响全部
- 子类创建时无法给父类构造函数传参
- 父类构造函数在设置原型时就被执行一次,可能产生冗余初始化
构造函数继承:解决属性共享问题
在子类构造函数里用 Parent.call(this, ...args) 显式调用父类构造函数。
Java Maven 项目审查工作流的通用输入处理。当 Java Maven 项目以 ZIP压缩包或 GitLab 仓库 URL 形式提供且需要...时使用。
- 每个子类实例拥有自己独立的属性(包括引用类型),互不干扰
- 无法继承父类原型上的方法(
Parent.prototype上的方法不会出现在子实例上) - 父类方法不能复用,每次新建实例都重新创建一份,浪费内存
组合继承:兼顾属性与方法的常用方案
把上面两种方式合起来:构造函数继承属性 + 原型链继承方法。
立即学习“Java免费学习笔记(深入)”;
- 子类既能拥有独立属性,又能使用父类原型方法
- 父类构造函数会被调用两次(一次在
Child.prototype = new Parent(),一次在Parent.call(this)),略低效 - 必须手动修复
constructor指向,否则childInstance.constructor会指向Parent
原型对象的维护要点
原型对象不是自动“认亲”的,需要主动维护几个关键连接:
-
Child.prototype = new Parent()建立原型链,但会覆盖Child.prototype.constructor,所以通常要补一句Child.prototype.constructor = Child -
Object.getPrototypeOf(childInstance) === Child.prototype是验证原型链是否正确的直接方式 - 避免直接改写
__proto__,推荐用Object.setPrototypeOf(obj, proto)或Object.create(proto)创建干净原型 - ES6 的
class语法只是封装,底层仍是原型链,extends实际做了类似组合继承+constructor 修复的工作

















