JavaScript 的 class 是原型继承的语法糖,本质是构造函数与原型操作,不改变对象创建模型,仅提升可读性与结构化程度。

JavaScript 中的 class 语法本质上是原型继承的语法糖,它没有引入新的面向对象机制,只是让基于原型的继承写起来更像传统 OOP 语言(如 Java、C++)。
class 声明会被编译为函数和原型操作
当你写一个 class,JS 引擎实际会把它转成一个构造函数,并把方法挂到该函数的 prototype 上。
例如:
class Person {
constructor(name) {
this.name = name;
}
sayHello() {
return `Hello, I'm ${this.name}`;
}
}
等价于:
立即学习“Java免费学习笔记(深入)”;
function Person(name) {
this.name = name;
}
Person.prototype.sayHello = function() {
return `Hello, I'm ${this.name}`;
};
两者创建的对象具有完全相同的原型链结构:person.__proto__ === Person.prototype,Person.prototype.constructor === Person。
所有“类方法”都定义在 prototype 上,而非实例上
这保证了方法复用——每个实例不重复创建函数,而是共享原型上的方法。
-
constructor是一个普通函数,用于初始化实例属性 - 其他方法(包括
static方法)默认不会出现在实例上 -
static方法直接挂在构造函数本身(Person.sayHi = ...),不进入原型链 - 实例方法必须通过
prototype访问,这是原型继承的核心机制
extends 和 super 的底层仍是原型链操作
extends 实际做了两件事:
- 设置子类的
prototype.__proto__指向父类的prototype(实现方法继承) - 设置子类构造函数的
__proto__指向父类构造函数(实现静态方法继承)
super() 在构造函数中相当于调用父类构造函数(Parent.call(this, ...));在方法中访问 super.xxx 则是通过 Object.getPrototypeOf(this).xxx 查找,本质仍是沿原型链向上查找。
new 关键字的行为从未改变
无论用函数还是 class 创建实例,new 都执行相同步骤:
- 创建一个空对象,其
__proto__指向构造函数的prototype - 将该对象作为
this执行构造函数 - 返回该对象(除非构造函数显式返回非 null 对象)
也就是说,class 并未修改 JavaScript 的对象创建模型,只是让这个过程更可读、更结构化。











