javascript 的 class 语法是原型链继承的语法糖,本质仍是函数与 prototype 机制:class 声明创建具 prototype 属性的函数;方法挂载于 prototype 且不可枚举;extends 通过设置 [[prototype]] 链实现继承;super() 等价于父类 call;静态成员直接挂载构造函数,不参与实例原型链。

JavaScript 中的 class 语法本身不创建新继承模型,它只是让原型链继承写起来更简洁、语义更清晰。所有 class 的行为——包括构造、实例化、方法调用、继承关系——最终都映射到函数、prototype 和 [[Prototype]] 链上。
class 声明本质是函数
当你写 class Person { constructor(name) { this.name = name; } },JavaScript 引擎实际把它编译为一个普通函数:
- 该 class 名(
Person)是一个具有prototype属性的函数对象; -
Person.prototype默认包含一个constructor方法,指向Person自身; - 类中定义的非静态方法(如
sayHello())被自动添加到Person.prototype上,且不可枚举; - 类声明会提升但不初始化,存在暂时性死区(TDZ),这点和
let类似。
extends 和 super 的原型链操作
class Student extends Person 并不是“复制”父类,而是通过底层机制建立原型链:
Java JDK 25 来自 OpenJDK 官方归档,版本为 JDK 25,本条下载地址已指向官方 Windows x64 zip 安装包直链,适合调试旧项目或兼容旧版 Java 运行环境。
-
Student.prototype.[[Prototype]]被设为Person.prototype(即Object.setPrototypeOf(Student.prototype, Person.prototype)); -
Student.[[Prototype]](即构造函数的隐式原型)被设为Person,使静态方法可继承; -
super()在子类构造器中等价于Person.call(this, ...args),确保父类初始化逻辑执行; - 若省略
super(),new 实例时会报错,因为this尚未绑定。
实例与原型链的真实结构
执行 const s = new Student('Alice') 后,对象关系如下:
-
s.[[Prototype]] → Student.prototype; -
Student.prototype.[[Prototype]] → Person.prototype; -
Person.prototype.[[Prototype]] → Object.prototype; -
Object.prototype.[[Prototype]] → null(链终点)。
属性查找始终沿此链进行:访问 s.sayHello() 时,先查 s 自身,再查 Student.prototype,再查 Person.prototype,最后到 Object.prototype。
静态成员与原型分离
class 中的 static 方法或属性不参与实例继承:
-
Student.staticMethod()直接挂在Student函数对象上,而非其prototype; -
Student.[[Prototype]] === Person,所以Student可以继承Person的静态方法; - 这与普通函数的静态属性行为一致,比如
Array.isArray就是挂载在Array构造函数上的。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










