class 与 function 本质相同,均为函数;但 class 是受限语法糖,不可直接调用、不支持提升,继承机制更统一,强制 super() 调用,方法默认不可枚举且挂载 prototype。

本质相同,都是函数;区别在于语法设计、继承机制和使用约束。
底层仍是函数,但 class 是受限的语法糖
class 声明创建的对象 typeof 为 "function",也满足 instanceof Function,说明它确实是构造函数。但 class 不允许像普通函数那样被直接调用(不加 new 会报错),也不支持函数提升(必须先声明再使用),而 function 声明可以被提升且能当作普通函数执行。
继承逻辑更统一:两条独立原型链
ES6 class 继承(extends)自动建立两套继承关系:
- 实例方法走 prototype 链:Child.prototype.__proto__ === Parent.prototype
- 静态成员走 类自身链:Child.__proto__ === Parent(所以 Child 可直接调用 Parent 的 static 方法)
ES5 中需手动组合:Person.call(this, ...) 处理实例属性,Object.create(Person.prototype) 处理原型方法,静态继承则完全靠开发者自行赋值,没有统一机制。
constructor 和 this 的使用更严格
在子类中,必须显式调用 super() 才能访问 this;未调用前使用 this 会报错。这强制保证父类初始化逻辑先执行。ES5 构造函数中没有此限制,this 在 new 过程中已绑定,可随时使用(哪怕没调用父类逻辑)。
方法默认不可枚举,且不挂载在实例上
class 内定义的方法自动添加到 prototype 上,且 不可枚举(for...in 不会遍历到);ES5 中若把方法写在构造函数体内(this.say = function(){}),每个实例都会拥有独立副本,浪费内存。虽然两者都可通过 prototype 共享方法,但 class 从语法上杜绝了“在 constructor 里重复定义方法”的常见错误写法。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











