javascript 的 class 是构造函数的语法糖,但存在四大关键差异:必须用 new 调用、声明不提升(tdz)、继承强制 super()、原生支持 static/私有字段/不可枚举方法。

JavaScript 的 class 写法和旧版构造函数写法,**本质没有新机制,都是基于原型链和 new 调用的同一套底层逻辑**。区别在于语法包装、行为约束和语义表达——class 是构造函数的语法糖,但不是“可有可无”的糖,它带来了几处关键且不可忽略的差异。
调用方式更严格
class 构造器必须用 new 调用,否则直接抛 TypeError;而传统函数构造器在非严格模式下可以被普通调用,this 会意外指向全局对象(比如浏览器中的 window),造成隐蔽 bug。
-
class Person { constructor() {} }→Person()报错 -
function Person() {}→Person()可能静默执行,污染全局
声明不会被提升
class 声明处于「暂时性死区」(TDZ),必须先定义、后使用;函数声明则会被提升,可在定义前调用。
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
-
new MyClass()在 class 声明前 →ReferenceError -
new Person()在 function 声明前 → 正常运行(函数提升) - 想提前使用 class?可用类表达式:
const MyClass = class { ... };
继承与初始化更规范
用 extends 和 super() 实现继承时,class 强制子类 constructor 中第一行调用 super(),确保父类实例属性正确初始化;传统写法靠手动 Parent.call(this) 或 Object.create(Parent.prototype),容易遗漏或出错。
- 没写
constructor?class 自动插入空构造器并隐式调用super() - 写了
constructor却忘了super()?运行时报ReferenceError: Must call super constructor... - 传统构造函数继承不强制,但
this初始化错误会导致属性为undefined
原生支持现代特性
static 方法、# 私有字段、私有方法等,是 class 语法原生支持的,无需手动模拟;传统构造函数只能靠闭包、WeakMap 或约定命名(如 _private)来近似实现,且无法真正保证私有性或继承一致性。
-
static create()→ 类名直接调用,语义清晰,可被子类继承/覆盖 -
#name = 'Alice'→ 外部访问直接报SyntaxError或TypeError - 类内方法默认不可枚举(
Object.keys(Person.prototype)拿不到),传统挂 prototype 的方法默认可枚举
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










