javascript的class本质上是构造函数的语法糖,即具名函数,挂载方法到prototype,强制new调用、不提升、不可枚举、默认严格模式,底层仍基于原型链机制。

是的,JavaScript 的 class 本质上就是一个函数——准确地说,是一个特殊构造函数。
typeof 检查直接暴露本质
无论你写的是 class Person {} 还是 const Animal = class {},用 typeof 一测就清楚:
-
typeof Person === "function"返回true -
Person.prototype.constructor === Person也成立 - 它甚至有
name属性:Person.name就是字符串"Person"
它和普通函数的关键区别
虽然类型相同,但行为被严格约束:
Java Maven 项目审查工作流的通用输入处理。当 Java Maven 项目以 ZIP压缩包或 GitLab 仓库 URL 形式提供且需要...时使用。
- 不能直接调用:
Person()会报错Class constructor Person cannot be invoked without 'new' - 不被提升:类声明不会像函数声明那样提前可用,访问未声明的类会触发
ReferenceError - 作用域更严格:类属于块级作用域,而函数声明属于函数作用域(在非严格模式下还有变量提升)
- 内部方法默认不可枚举:
Object.keys(Person.prototype)不会列出你定义的实例方法
底层运行时干了什么
引擎看到 class,其实悄悄做了这些事:
- 生成一个不可重写、不可枚举的函数对象
- 自动把所有非静态方法挂到
.prototype上(不用手写MyClass.prototype.xxx = function(){}) - 确保
constructor是普通函数(不允许箭头函数或function*) - 对
extends做语义转换:比如class B extends A等价于手动设置Object.setPrototypeOf(B, A)和Object.setPrototypeOf(B.prototype, A.prototype)
为什么说它是“语法糖”而不是新机制
因为所有面向对象行为,依然靠原型链驱动:
-
new Person()仍会创建对象,将其__proto__指向Person.prototype -
instance instanceof Person判断仍是基于原型链查找 - 继承、属性查找、方法调用,全部走的是和传统构造函数 +
prototype完全一致的路径 - 没有新增类型系统,也没有改变 JavaScript 的动态、基于原型的本质
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










