javascript 的 class 是构造函数与原型链操作的语法糖,本质仍是基于原型的继承;它生成普通函数对象但强制 new 调用,方法挂载 prototype 且不可枚举,extends 底层操作原型链,super() 对应显式父类调用。

JavaScript 中的 class 本质是构造函数加原型链操作的语法糖,不是新机制,也不改变原型继承模型。它只是用更清晰、更结构化的写法,封装了 ES5 中手动定义构造函数、挂载方法到 prototype、设置继承关系等重复性操作。
Class 就是函数,但有额外约束
你写 class Person { constructor(name) { this.name = name; } },JS 引擎内部生成的是一个普通函数对象:
-
typeof Person返回"function" - 该函数默认不可直接调用,必须用
new;否则会报Class constructor Person cannot be invoked without 'new' - 引擎自动插入
_classCallCheck检查,确保调用方式合法 - 类名不会被提升(不像函数声明),提前访问会报
ReferenceError
实例方法都挂在 prototype 上
所有非静态方法(如 sayHello())都会被自动添加到 Person.prototype,和 ES5 手写完全一致:
Person.prototype.sayHello = function() { ... };- 方法不可枚举:
Object.keys(Person.prototype)不会列出它们 - 保证复用性:每个实例共享同一份方法,不重复创建函数
extends 继承就是原型链连接
class Child extends Parent 底层只做三件事,全是原型链层面的操作:
-
Child.prototype = Object.create(Parent.prototype):让子类原型链上接父类原型 -
Child.prototype.constructor = Child:修复构造器引用 -
Child.__proto__ = Parent:使静态方法也能被继承(比如Parent.staticMethod()→Child.staticMethod())
super() 是显式调用,不是魔法
在子类 constructor 中必须第一行写 super(),它等价于:
-
Parent.call(this, ...args):初始化父类属性,否则访问this会报错 - 在普通方法里写
super.xxx(),本质是Object.getPrototypeOf(this).xxx.call(this),沿原型链向上找
不复杂但容易忽略
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











