JavaScript 的 class 是语法糖,本质仍是函数和原型链操作。它通过简洁语法封装构造函数、prototype 设置、继承(extends)和 super 调用,所有功能均可手动用原型机制实现,Babel 编译即为证明。

JavaScript 的 class 不是新机制,它只是把原本需要手动操作原型链的写法,用更简洁、结构化的形式表达出来。底层运行时,它和你手写构造函数 + prototype + Object.setPrototypeOf 完全等价。
class 本质仍是函数
定义一个 class Person,实际生成的是一个函数对象:typeof Person === 'function' 成立。
它的方法(如 sayHi())自动挂载到 Person.prototype 上,不是直接放在实例上。
每个实例的 __proto__ 仍指向 Person.prototype,原型链没变:实例 → Person.prototype → Object.prototype → null。
extends 就是在设置原型链
class Dog extends Animal 看似是“类继承”,实则做了两件事:
- Dog.prototype.__proto__ = Animal.prototype(让实例方法可继承)
- Dog.__proto__ = Animal(让静态方法可继承,比如 Animal.create() 在 Dog 上也能用)
这和手动调用 Object.setPrototypeOf(Dog.prototype, Animal.prototype) 和 Object.setPrototypeOf(Dog, Animal) 效果一致。
super() 是对父构造函数的显式调用
在子类 constructor 中写 super(),等价于:
- 调用 Animal.call(this, ...args)
- 确保 this 正确绑定到当前实例
它不创建新上下文,只是沿原型链向上委托执行构造逻辑。
所有 class 特性都能用原型写法还原
没有 class 也能实现完全一样的行为:
- 手动设置 Child.prototype = Object.create(Parent.prototype)
- 修复 constructor 指向
- 在函数对象上挂静态方法
- 用 Object.defineProperty 实现 get/set
Babel 等工具正是把 class 编译成这类代码,说明它确实是语法糖,而非新模型。


















