js中class是函数和原型的语法糖,本质是构造函数与prototype操作;需分四步掌握:认清本质、掌握写法、理解继承、识别边界。

JS 中 class 语法不是新语言,而是函数和原型机制的语法糖。真正学透它,关键不在“怎么写 class”,而在于“class 背后调用的是什么、this 怎么绑定、继承为什么这样设计”。系统学习要分三步走:先看清本质,再掌握写法,最后在真实场景中识别陷阱。
第一步:从构造函数出发,理解 class 的真实身份
class 不是面向对象的起点,而是封装已有逻辑的更清晰写法。所有 class 编译后仍是基于 function 和 prototype:
-
class Person {}等价于function Person() {},只是不能被提升(必须先声明再使用) -
class Person { say() {} }中的say方法,实际会加到Person.prototype上,和Person.prototype.say = function() {}效果一致 -
static method()是直接挂在Person函数本身上的,相当于Person.method = function() {}
第二步:掌握 class 的核心写法与限制
class 有明确语法规则,违反就会报错,不是可选项:
- 类体中只能写方法、getter/setter、
constructor,不能写变量声明(如name = "Tom"会报错;ES2022 后支持公有字段,但需明确知道它是实例属性,非 prototype 属性) -
constructor是可选的,不写时 JS 自动插入空构造器;写了就必须用super()调用父类构造器(子类中),否则报错 - 方法默认不可枚举(
Object.keys(Person.prototype)拿不到),且自动设为严格模式,无需手动写"use strict"
第三步:继承与 super 的行为必须亲手验证
很多人以为 extends 就是“复制父类”,其实它建立的是原型链 + 构造器委托关系:
-
class Child extends Parent会让Child.prototype.__proto__ === Parent.prototype,这是方法继承的基础 -
super()在子类 constructor 中调用,等价于Parent.call(this, ...args),负责初始化this;不调就无法访问this -
super.xxx在方法中调用,等价于Parent.prototype.xxx.call(this),用于复用父类逻辑(注意:不能在箭头函数或静态方法里用super)
第四步:在真实场景中识别 class 的边界
class 解决不了所有问题,熟练者会主动判断是否该用它:
- 需要动态生成方法名?用 class 写不了,得回归普通对象或
Object.defineProperty - 要兼容 IE11?class 会被 Babel 转成函数+
Object.setPrototypeOf,但某些 polyfill 对super支持不全,建议测试关键路径 - 处理事件回调时
this丢失?class 方法默认不绑定this,别指望obj.handleClick直接传给addEventListener,仍需.bind(this)、箭头函数或事件代理











