ES6 class 是构造函数的语法糖,引擎将其转译为带约束的函数与原型链操作。它隐式启用严格模式、强制 new 调用、不可枚举 constructor,并将方法挂载到 prototype;extends 通过三步硬编码设置原型链;super() 是 this 初始化的必要闸门。

ES6 class 在现代 JavaScript 引擎中没有独立的运行时机制,它完全被解析为构造函数 + 原型链操作——引擎不识别 class 关键字本身,而是按预设规则将其转译为等效的函数与对象关系代码。
class 就是带约束的构造函数
当你写 class Person { constructor(name) { this.name = name; } },V8、SpiderMonkey 或 JavaScriptCore 等主流引擎在解析阶段就将其视为一个特殊标记的函数声明。它自动附带:
- 隐式
"use strict"模式 - 强制
new调用检查(若直接调用会抛出TypeError: Class constructor Person cannot be invoked without 'new') - 不可枚举的
constructor属性,且不能被delete - 内部使用
[[FunctionKind]]: "classConstructor"标记,影响typeof和堆栈追踪显示
方法定义全部落在 prototype 上
类体中所有非静态方法(如 sayHello() {})在初始化时被一次性定义并挂载到 Person.prototype,和 ES5 手写 Person.prototype.sayHello = function() {...} 效果一致。引擎不会为每个实例重复创建函数,复用机制完全依赖原型链查找。
静态方法(static create())则直接作为属性赋给构造函数本身,即 Person.create = function() {...},其继承靠的是 Child.__proto__ === Parent 这一链接,而非原型链。
立即学习“Java免费学习笔记(深入)”;
extends 的三步原型链设置是硬编码行为
遇到 class Child extends Parent,引擎执行的不是抽象“继承”,而是确定的三步原语操作:
-
Child.prototype = Object.setPrototypeOf({}, Parent.prototype)(或等效的Object.create(Parent.prototype)) Child.prototype.constructor = Child-
Object.setPrototypeOf(Child, Parent)(使Child.superMethod()可访问Parent静态成员)
这些步骤在语法解析后立即固化,不依赖运行时反射或元编程,因此性能可预测、调试路径清晰。
super() 是 this 初始化的必要闸门
子类构造器中 super() 不是语法装饰,而是触发父类构造函数执行的唯一合法方式。引擎在此处确保:
- 父构造函数必须先完成对
this的初始化(分配内存、设置内部槽位) - 未调用
super()前访问this会直接报ReferenceError: Must call super constructor in derived class before accessing 'this' - 在普通方法中
super.xxx()等价于Object.getPrototypeOf(Object.getPrototypeOf(this)).xxx.call(this),严格按当前实例的原型链向上找一层
它不是新模型,只是把原本需要开发者手动维护的原型连接、构造器绑定、this 初始化顺序,变成由引擎统一保障的语法契约。理解这一点,就能在调试时准确映射源码行号到实际执行的原型操作,也能避开常见陷阱,比如误以为 class 支持私有继承或多重继承。


















