es6 的 class 本质是构造函数 + 原型链操作的语法糖,它未新增继承机制,所有行为仍依赖 [[prototype]] 链;编译后等价于函数定义与 prototype 操作,并通过 object.setprototypeof 实现 extends 继承,同时提供 new 强制调用、方法不可枚举/不可配置等安全约束。

ES6 的 class 本质是**构造函数 + 原型链操作的语法糖**,它没有新增任何继承机制,所有行为仍完全依赖 JavaScript 原有的 [[Prototype]] 链。它只是把原本分散、易错的手动写法,包装成结构清晰、语义明确的类式语法。
class 声明实际被编译成函数
当你写:
class Person {
constructor(name) {
this.name = name;
}
sayHi() {
return `Hi, I'm ${this.name}`;
}
}
JavaScript 引擎内部会等价处理为:
你接手一个需求时,是不是经常这样:"改一个小字段 → 结果把不相关的代码也改了"、"需求说得很模糊 → 做着做着发现跑偏了"、"数据库加个字段 → 上线才发现漏了数据兼容"、"做了个新功能 → 一个月后自己都忘了当时怎么设计的"、"写到一半被中断 → 再回来不知道从哪继续";这个 Skill 就是专门解决这些问题的。 它会自动探测你的项目环境(JDK、Spring Boot、ORM、数据库、前端框架),记在
- 定义一个普通函数
function Person(name) { this.name = name; } - 自动设置
Person.prototype.constructor = Person - 把
sayHi方法挂到Person.prototype上(和 ES5 中Person.prototype.sayHi = function() {...}效果一致) - 验证:
typeof Person === 'function'为true,Person === Person.prototype.constructor也为true
继承(extends)底层靠 Object.setPrototypeOf
使用 extends 并不创建新继承模型,而是自动调用 Object.setPrototypeOf(Child.prototype, Parent.prototype) 来建立原型链连接。
- 子类的
prototype对象的[[Prototype]]被设为父类的prototype -
super()在子类constructor中实际调用的是父类构造函数,并绑定this到当前实例 - 静态方法也通过
Object.setPrototypeOf(Child, Parent)实现继承(即子类可直接调用父类静态方法)
class 强制约束让原型链更安全
相比手动写构造函数,class 加入了几项运行时保障:
- 必须用
new调用,否则报错(避免忘记new导致this指向全局) - 类中定义的方法默认不可枚举(
enumerable: false),不会被for...in遍历到 - 类体中所有方法不可写、不可配置(
writable: false, configurable: false),防止意外覆盖 - 子类
constructor必须先调用super(),确保this正确初始化
它解决的是“怎么写”,不是“怎么运行”
ES6 class 没有改变 JavaScript 的运行时模型,它解决的是开发体验问题:
- 把零散的
function、.prototype.xxx =、Child.prototype = Object.create(Parent.prototype)等操作,收束到一个声明块里 - 让继承关系一目了然,不用再手动维护
constructor指针或担心new Parent()带来副作用 - 降低从其他语言转来的开发者理解门槛,同时保持与旧代码完全兼容
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










