JavaScript继承机制演变本质是开发者从“手动拼装原型链”走向“声明式表达意图”:ES5靠手写prototype、call/apply实现寄生组合继承;ES6用class/extends语法糖封装原型逻辑;ES2018–ES2022通过私有字段、静态块等增强类健壮性;底层始终依赖原型链查找。

JavaScript 继承机制的演变,本质是开发者从“手动拼装原型链”走向“声明式表达意图”的过程。ES5 时期没有语法支持,一切靠理解 prototype、__proto__ 和 call/apply 的协作;ES6 引入 class 和 extends 后,写法变简洁,但底层仍是原型链;ES2022 及之前(如 ES2019、ES2020、ES2021)则在继承周边持续补强——比如私有字段、静态块、逻辑赋值运算符等,让类内部结构更健壮、初始化更可控。
ES5:靠手写实现,每一步都得懂原型
ES5 没有继承关键字,必须组合多种技术才能模拟出合理的行为:
- 用
Parent.call(this, ...)在子构造函数中复制实例属性,避免引用类型共享 - 用
Child.prototype = Object.create(Parent.prototype)建立方法继承链,不执行父类构造函数 - 手动修复
Child.prototype.constructor = Child,否则instanceof和构造器识别会出错 - 典型方案是“寄生组合继承”,它规避了传统组合继承中父类构造函数被调用两次的问题
ES6(2015):class 是语法糖,但改变了开发体验
class 并没有改变 JavaScript 的继承模型,只是把上述手动步骤封装成可读性高、不易出错的语法:
-
extends自动设置原型链,super()自动绑定并调用父类构造函数 - 子类构造函数中必须显式调用
super(),否则无法访问this,这是对原型链初始化顺序的强制约束 - 静态方法、getter/setter、
new.target等特性让类行为更接近传统 OOP,但所有方法仍挂载在原型上
ES2018–ES2022:围绕 class 做精细化增强
这些版本没有新增继承语法,但通过新特性显著提升了类的表达力和安全性:
立即学习“Java免费学习笔记(深入)”;
-
ES2019:
Array.prototype.flat()和flatMap()虽不直接关联继承,但在处理继承结构中的嵌套数据时更自然 -
ES2020:私有字段
#field让类真正具备封装能力,避免子类意外覆盖或读取父类内部状态 -
ES2021:逻辑赋值运算符(
&&=,||=,??=)简化了子类初始化中默认值合并逻辑 -
ES2022:类的静态块(
static { ... })允许在类定义时执行一次性初始化,比如注册子类、预加载资源、校验继承契约
关键提醒:继承不是“类之间复制”,而是“原型链查找”
无论写法如何变化,JavaScript 中的继承始终依赖于运行时的原型链查找机制。这意味着:
- 所有实例方法都在原型上,不是每个实例一份,节省内存
- 动态修改父类原型,会影响所有已创建的子类实例(包括已存在的)
-
instanceof判断的是对象的__proto__链是否包含某构造函数的prototype - 装饰器(虽在 ES2024 才标准化)已在部分环境用于修饰类继承行为,例如自动注入依赖或拦截
super()调用


















