class本质是构造函数的语法糖,但增加了new强制调用、默认严格模式、方法不可枚举、暂时性死区四大运行时约束,底层仍基于原型链,typeof返回"function"。

直接说本质:class 是构造函数的语法糖,但不是“没变化”的糖——它加了运行时约束、语义强化和原型链封装。面试官不关心你背没背“语法糖”这个词,而是看你能不能讲清 写法差异背后的设计意图 和 运行时行为的关键区别。
一、先锚定底层:class 依然是原型链,不是新机制
必须明确一点:class 没有引入新的对象模型。它编译后仍是函数,实例的 __proto__ 依然指向 ClassName.prototype,原型链查找逻辑完全没变。
-
typeof class {}返回"function",不是"class" -
class Person {}等价于function Person() {}(带额外限制) - 所有实例方法自动挂载到
prototype上,共享而非重复创建
二、重点答出四条硬性差异(面试高分关键)
别只说“语法更简洁”,要指出 ES5 构造函数做不到或容易出错的地方:
将一个或多个视频上传至YouTube。当用户想“上传到YouTube”“发YouTube”“批量上传”“upload to YouTube”“post videos to YouTube”或发布到YouTube时使用此技能。
-
调用方式强制:class 必须用
new调用,否则报Class constructor X cannot be invoked without 'new';ES5 构造函数可误作普通函数调用(this指向全局) -
默认严格模式:class 内部自动启用严格模式,无需手动写
"use strict",避免静默失败 -
方法不可枚举:class 中定义的方法(如
sayHi())在for...in或Object.keys()中不可见;ES5 手动挂到prototype的方法默认可枚举 -
暂时性死区(TDZ)生效:class 声明不提升,且在声明前访问会报错(
Cannot access 'X' before initialization),比var更严格
三、继承部分必须讲清 super 的两个作用
很多候选人只记得“子类 constructor 里要写 super()”,但说不清为什么:
-
super()在子类构造函数中是 必须调用 的,它负责初始化this(即把父类的实例属性挂到当前对象上),不调用就无法使用this -
super.xxx在方法中用于调用父类同名方法或访问父类属性,它等价于Object.getPrototypeOf(this).xxx - 注意:
super()必须在this使用前调用,否则报错
四、静态方法与实例方法的本质区别
这是常被混淆的点,一句话讲清:
- 实例方法定义在
ClassName.prototype上,供每个实例调用 - 静态方法定义在
ClassName函数本身上(即构造函数对象上),只能通过类名调用,不能被实例访问 - 静态方法内部的
this指向类本身(ClassName),不是实例
不复杂但容易忽略:真正拉开差距的,不是你会不会写 class,而是你能否一眼指出 class A { m() {} }; A.prototype.m 和 function B() {}; B.prototype.m = function() {} 在可枚举性、调用限制、TDZ 行为上的实际差异。










