class语法更直观紧凑、继承更简洁明确、运行约束更严格且底层仍基于原型链。它用class关键字封装定义,extends实现继承,强制严格模式、不提升、需new调用,方法默认不可枚举,本质是原型机制的语法糖。

语法结构更直观,写法更紧凑
Class 用 class 关键字包裹整个定义,构造逻辑集中于 constructor 方法,实例方法、静态方法、getter/setter 都直接写在类体内。不用反复写 Constructor.prototype.xxx = function() {...},也不用手动绑定原型链。
函数构造函数则需分开声明:属性在函数体内赋值,方法要挂到 prototype 上,静态方法直接挂在函数本身。代码分散,阅读时需来回跳转。
继承机制更简洁,语义更明确
Class 使用 extends 和 super() 实现继承,子类构造器中调用 super() 即可完成父类初始化,逻辑清晰,不易出错。
函数构造函数实现继承需三步:用 Parent.call(this, ...) 绑定父类实例属性,再用 Object.create(Parent.prototype) 设置子类原型,最后修正 constructor 指向。步骤多、易遗漏、难维护。
运行约束更严格,行为更确定
- Class 总是运行在严格模式下,无需显式写
"use strict" - Class 不会变量提升(hoist),必须先声明后使用,避免意外的
ReferenceError - Class 必须用
new调用,否则报TypeError;而构造函数不加new也能执行(只是this指向全局,容易引发 bug) - Class 中的方法默认不可枚举,遍历对象时不会出现;构造函数挂载在
prototype上的方法默认可枚举
底层仍是原型,但封装更完善
Class 是语法糖,编译后依然基于原型链和 __proto__ 实现。它没有改变 JavaScript 的面向对象本质,只是把原型操作包装得更安全、更一致。
比如 class A {} 编译后等价于一个函数,其 A.prototype 自动设置好,A.prototype.constructor 自动指向 A;而手写构造函数时,若忘了重置 constructor,实例的 constructor 可能指向 Object,造成类型判断混乱。











