es6 class是es5构造函数+原型链的语法糖,未改变原型继承本质;它通过constructor、extends、super等语法简化声明与继承,提升可读性与开发效率,底层仍依赖[[prototype]]链。

JavaScript 的原型系统本身没有“演进”,变化的是我们描述和使用它的语法方式。ES6 的 class 并非新机制,而是对 ES5 构造函数 + 原型链这一底层模型的封装与简化。
ES5:手动操作原型链
在 ES5 中,面向对象完全依赖开发者显式管理:
- 用函数作为构造器,
this绑定实例属性 - 把共享方法挂到
Constructor.prototype上 - 实现继承需两步:用
Parent.call(this)继承属性,再用Object.create(Parent.prototype)设置原型链 - 必须手动修复
constructor指向,否则子类实例的constructor会指向父类
ES6 class:更清晰的语法糖
class 关键字不改变原型继承的本质,只是让相同逻辑写得更直观:
-
constructor()明确标识初始化逻辑,替代了裸函数定义 - 方法直接写在类体中,默认添加到原型上,无需手动写
.prototype.xxx = function() {} -
extends和super()将继承步骤收束为声明式语法,自动建立正确的原型链(Child.prototype.__proto__ === Parent.prototype) - 静态方法用
static标识,语义明确,且可被子类继承(ES5 中需额外赋值)
关键不变量:原型链仍是核心
无论写法如何变化,以下事实始终成立:
- 每个实例的
[[Prototype]](即__proto__)都指向其构造器的prototype对象 - 方法调用时的查找路径仍是沿着
[[Prototype]]向上遍历 -
instanceof判断、Object.getPrototypeOf()、isPrototypeOf()等 API 行为完全一致 - Babel 编译后的 ES6 class 输出仍是 ES5 风格的构造函数和原型赋值
为什么需要 class?
它解决的不是运行时能力问题,而是开发体验和协作效率:
- 降低初学者理解门槛,语法更接近主流 OOP 语言
- 减少手写原型操作出错的概率(比如漏修
constructor) - 让继承关系一目了然,提升代码可读性和维护性
- 为静态类型工具(如 TypeScript)和 IDE 提供更稳定的结构推导基础
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











