ES6的class本质是构造函数+原型链的语法糖,它不引入新机制,仅将手动原型操作(如prototype赋值、constructor修正)封装为更直观的声明式写法,运行时仍完全依赖[[Prototype]]链驱动。

ES6 的 class 本质是构造函数 + 原型链的语法糖,不是新机制,也不改变 JavaScript 的继承模型——所有行为仍由 [[Prototype]] 链驱动。
它为什么叫“语法糖”
因为写法更直观,但运行时立刻被引擎转成等价的函数和原型操作:
-
class Person { constructor(name) { this.name = name; } }等价于function Person(name) { this.name = name; } - 类体中定义的实例方法(如
sayHi())自动挂载到Person.prototype上,和手动写Person.prototype.sayHi = function() {...}效果完全一致 -
typeof Person返回"function",Person === Person.prototype.constructor为true,直接印证其函数本质
底层转换的关键动作
当你声明一个 class,JS 引擎内部会做这几件事:
- 生成一个不可枚举、不可配置、不可重写的构造函数
- 自动设置该函数的
prototype属性,并把constructor指回自身 - 把所有非静态、非 getter/setter 的方法,作为不可枚举属性添加到
prototype对象上 - 强制要求用
new调用,否则抛出TypeError(这是比普通函数更严格的封装)
继承(extends)是怎么工作的
extends 看似新特性,实际只是封装了寄生组合继承的样板逻辑:
-
class Child extends Parent会自动调用Object.setPrototypeOf(Child, Parent)实现静态属性继承 - 同时设置
Child.prototype.__proto__ = Parent.prototype,打通实例方法的原型链 -
super()在子类constructor中,本质是调用Parent.call(this, ...args) - 整个过程不引入任何新链路,仍是标准的
[[Prototype]]查找机制
它解决了什么实际问题
不是为了替换原型链,而是让开发者远离容易出错的手动操作:
- 不用再写
Child.prototype = Object.create(Parent.prototype)和修正constructor - 不必区分“实例属性写在构造函数里”和“共享方法写在 prototype 上”的心智负担
- 静态方法、getter/setter、私有字段(
#field)等特性统一收口,语义明确


















