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),必须先定义、后使用;函数声明则会被提升,可在定义前调用。
-
new MyClass()在 class 声明前 →ReferenceError -
new Person()在 function 声明前 → 正常运行(函数提升) - 想提前使用 class?可用类表达式:
const MyClass = class { ... };
继承与初始化更规范
用 extends 和 super() 实现继承时,class 强制子类 constructor 中第一行调用 super(),确保父类实例属性正确初始化;传统写法靠手动 Parent.call(this) 或 Object.create(Parent.prototype),容易遗漏或出错。
立即学习“Java免费学习笔记(深入)”;
- 没写
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 的方法默认可枚举


















