JavaScript只有原型继承,class只是语法糖;对象通过[[Prototype]]链委托查找属性,函数的prototype决定实例原型,Object.create或setPrototypeOf可动态设置继承关系,类语法更严格但易读,选择取决于场景需求。

JavaScript 中没有真正意义上的“类继承”,只有原型继承;所谓类继承,只是用 class 语法对原型继承做的封装和简化,底层完全一致。
原型继承是 JavaScript 的底层机制
每个对象内部都有一个 [[Prototype]] 链接(可通过 Object.getPrototypeOf() 获取),属性查找时会沿着这条链逐级向上委托。函数对象自带 prototype 属性,用于指定用 new 创建实例时,该实例的 [[Prototype]] 指向谁。
- 原型可以随时动态修改,影响所有已存在和将创建的实例
- 任意对象都能设为另一个对象的原型,比如
Object.setPrototypeOf(obj, proto) - 不依赖构造函数也能实现继承,例如直接用
Object.create(animal)创建新对象并链接到animal
类语法是原型继承的语法糖
class 关键字没有引入新机制,它只是让原型操作更集中、更可读:
-
constructor对应传统构造函数 - 类中定义的实例方法自动挂载到
ClassName.prototype上 -
extends实际执行的是设置子类prototype.__proto__ = Parent.prototype -
super()本质是调用父类构造函数,并确保this正确绑定
关键行为差异在于设计意图和约束力
虽然运行时都走原型链,但两种写法体现的编程风格和限制不同:
立即学习“Java免费学习笔记(深入)”;
- 函数+原型方式更灵活:可手动替换原型、混入多个对象、运行时切换行为
- 类语法更严格:必须用
new调用、自动启用严格模式、constructor不提升、子类必须调用super() - 类无法表达原型的全部能力,比如不能直接给普通对象(非构造函数实例)设置继承关系
选哪种不是看“新旧”,而是看场景:需要精细控制原型链或兼容老代码,用函数+原型;追求结构清晰、团队协作或对接 TypeScript/Babel 工具链,用 class 更稳妥。


















