javascript中的class本质上是构造函数的语法糖,不是新机制,也不改变原型继承逻辑;它底层仍是函数,方法挂载prototype,实例通过[[prototype]]链访问,typeof返回"function"。

JS 中的 class 本质上就是构造函数的语法糖,不是新机制,也不改变原型继承的底层逻辑。它让面向对象写法更清晰,但运行时行为和传统构造函数几乎完全一致。
底层本质相同:都是函数,都靠 prototype
用 class 声明的类,typeof 返回 "function",它本身就是一个普通函数对象;它的方法默认挂载在 prototype 上,实例通过 [[Prototype]] 链访问这些方法。
-
class Person { constructor(name) { this.name = name; } }等价于function Person(name) { this.name = name; } -
Person.prototype真实存在,且所有实例共享该对象上的方法 -
person.__proto__ === Person.prototype为true,和构造函数完全一样
关键区别集中在语法与约束上
虽然底层一致,但 class 引入了更严格的语义规则,避免常见错误:
-
class不支持变量提升,未声明前访问会抛ReferenceError;函数声明则可提升 - 必须用
new调用class,否则报TypeError;而普通函数可直接调用(this可能意外指向全局) - 子类中若定义了
constructor,第一行必须调用super(),否则无法访问this -
class内部定义的方法默认不可枚举(Object.keys()、for...in拿不到),构造函数手动挂到prototype上的方法也一样,但这是显式操作,容易忽略
静态方法与继承链的映射方式一致但更明确
静态方法不是“类独有的新东西”,只是把函数直接赋值给类本身(即函数对象),和手写 MyClass.staticMethod = function() {} 效果相同;而实例方法仍走 prototype。
- 子类的
__proto__指向父类,是为了让静态方法也能沿链继承(Child.staticMethod可以访问Parent.staticMethod) - 这和实例方法走
prototype链是平行设计:一个管静态,一个管实例,底层都是函数对象 + [[Prototype]] 查找
省略 constructor 不影响行为,但隐含逻辑更统一
没写 constructor,JS 自动插入空的 constructor() {},不初始化属性,也不调用 super()(子类中仍需显式调用)。
- 这保持了“每个类都有构造逻辑”的语义完整性
- 传统构造函数没有这个自动补全,容易遗漏初始化,或误以为不写就等于无操作
- 但底层仍是函数执行:
this指向新实例,返回值逻辑也一致(不 return 对象时默认返回this)











