javascript中的类是如何工作的_为什么class语法本质仍是原型继承

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}`;
  }
}

等价于:

function Person(name) {
  this.name = name;
}
Person.prototype.sayHello = function() {
  return `Hello, I'm ${this.name}`;
};

两者创建的对象具有完全相同的原型链结构:person.__proto__ === Person.prototypePerson.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 的对象创建模型,只是让这个过程更可读、更结构化。