JavaScript仅支持原型继承,class和extends是其语法糖;对象通过[[Prototype]]链查找属性,类继承自动建立实例与静态继承关系,二者运行效果一致但开发体验与约束不同。

JavaScript 只有一种继承机制:原型继承。所谓“类继承”,其实是 ES6 引入的 class 和 extends 语法糖,底层完全基于原型链,没有改变语言本质。
原型继承是 JavaScript 的底层机制
每个对象都有一个内部属性 [[Prototype]](可通过 __proto__ 或 Object.getPrototypeOf() 访问),指向它的原型对象。当读取属性时,如果对象自身没有,引擎会沿着这条链向上查找,直到找到或抵达 Object.prototype.__proto__ === null。
常见操作包括:
- 用构造函数的
prototype属性设置所有实例共享的方法 - 手动让子类原型指向父类实例(如
Child.prototype = new Parent())或更安全地用Object.create(Parent.prototype) - 必须手动修复
constructor指向,否则Child.prototype.constructor会指向Parent - 无法直接继承父类的静态方法,需额外赋值(如
Child.method = Parent.method)
类继承是原型继承的语法封装
class 不是新类型,它只是把构造函数、原型方法、继承逻辑包装得更清晰:
立即学习“Java免费学习笔记(深入)”;
-
class A extends B自动建立两层关系:实例的__proto__连向B.prototype,同时A.__proto__指向B(支持静态方法继承) -
super()在子类constructor中强制调用父类构造器,避免遗漏初始化 - 类中定义的方法默认不可枚举,且自动启用严格模式
- 不支持函数提升,
class声明存在暂时性死区(TDZ)
关键区别不在运行结果,而在写法和约束
两种方式创建的对象,其原型链结构、属性查找行为、方法复用效果完全一致。差异体现在开发体验和安全性上:
- 原型继承更灵活,但也容易出错——比如忘记修复
constructor、引用类型属性被所有实例共享、静态方法丢失 - 类继承限制更多(如必须用
new调用、super必须在this前调用),但减少了低级错误,语义更明确 - 类支持私有字段(
#field)、static、getter/setter等现代特性,组织性更强
基本上就这些。理解原型才是根本,class 只是帮你少写几行易错代码。











