es6 的 class 是基于原型继承的语法糖,自动实现寄生组合式继承:super() 调用父构造函数,extends 设置原型链并修复 constructor,静态成员自然继承,方法定义清晰且支持 super 调用,兼容性好但需注意不提升和 new 调用限制。

ES6 的 class 关键字不是新继承机制,而是基于原型继承的语法糖,但它让寄生组合式继承(最接近传统面向类语言的模式)变得简洁、可读、不易出错。
用 class + extends 替代手动模拟寄生组合继承
传统寄生组合继承需手动:1)调用父构造函数(Parent.call(this, ...))实现实例属性继承;2)用 Object.create(Parent.prototype) 设置子类原型并修复 constructor。而 class 自动完成这两步:
-
super()在子类构造器中自动绑定并调用父构造函数,传递this和参数,等价于Parent.call(this, ...) -
extends自动设置子类的prototype为Object.create(Parent.prototype),且正确维护constructor指向 - 无需手动操作
__proto__或Object.setPrototypeOf,避免常见陷阱(如丢失静态方法、破坏 instanceof)
静态方法与属性自然继承
传统方式中,静态成员(如 Parent.method = function(){})不会被 Object.create 影响,需额外复制。而 class 中 static 声明的成员会自动通过 SubClass.__proto__ === Parent 链继承:
- 子类可直接调用
Parent.staticMethod()和SubClass.staticMethod() - 若子类重写
static method(),仍可通过super.staticMethod()调用父类版本(仅限在子类静态方法内) - 无需
Object.assign(SubClass, Parent)等手动拷贝逻辑
方法定义更清晰,避免 this 绑定混乱
寄生组合继承中,若在父类原型上挂载箭头函数或未绑定方法,容易在子类实例上调用时丢失上下文。而 class 方法默认是“非绑定”的普通函数,且语义明确:
- 所有类方法都定义在
ClassName.prototype上,行为一致 - 子类重写方法时,
super.methodName()提供安全、显式的父类调用语法,替代易错的Parent.prototype.methodName.call(this) - 构造器中可放心使用
this.xxx = xxx初始化实例属性,不再需要区分“该放构造函数还是原型”
兼容性与降级提醒
class 本质仍是原型链,Babel 可完美转译为 ES5 寄生组合继承代码,但要注意:
- 必须用
new调用类构造器,否则抛出错误(比传统函数更严格,反而是优势) - 类声明不提升(hoisting),需先定义后使用,避免传统函数声明式继承中的隐式提升干扰
- 私有字段(
#field)和私有方法暂不被所有环境支持,如需强封装,仍需闭包或 Symbol 模拟











