JavaScript采用基于原型的继承,因其“一切皆对象”和运行时高度动态的本质;原型链实现委托共享、动态修改、轻量复用,ES6 class仅为语法糖,底层仍是原型机制。

JavaScript 选择基于原型的继承,不是权衡之后的妥协,而是为适配其“一切皆对象”和“运行时高度动态”的本质所作的自然设计。
语言底层是对象,不是类
Java、C++ 等语言先有“类”这个编译期概念,再实例化出对象;而 JavaScript 从诞生起就没有类——只有对象字面量 {}、函数(也是对象)、数组(也是对象)。既然没有类,就无法靠“类定义”来统一描述行为,只能让对象自己携带可复用的逻辑,并通过链接共享。原型就是那个“携带并共享逻辑”的对象容器。
- 每个函数自动带
prototype对象,供未来实例共用方法 - 每个实例通过
[[Prototype]]链接到它,形成委托关系 - 不需要提前声明“类型”,对象随时可增删属性或换原型
运行时灵活性优先
基于原型的继承允许在程序执行中修改原型、替换整个原型链,甚至给单个对象设置专属原型。这种能力在类系统里很难安全实现:
Java Maven 项目审查工作流的通用输入处理。当 Java Maven 项目以 ZIP压缩包或 GitLab 仓库 URL 形式提供且需要...时使用。
-
Object.prototype.toString可被临时重写,影响所有对象(谨慎但可行) - 用
Object.setPrototypeOf(obj, newProto)动态切换行为 - 库如 Lodash 或 Vue 的响应式系统,依赖的就是这种运行时可干预的委托链
轻量与复用更直接
原型链不强制“实例必须属于某个类”,而是让对象按需组合能力。一个普通对象可以轻松继承多个来源的行为(比如混入 EventEmitter.prototype 和 Serializable.prototype),无需多重继承语法或复杂接口实现。
立即学习“Java免费学习笔记(深入)”;
- 避免类层级爆炸:不用为“会飞的哺乳动物”专门建一个类,只需把
Flyable的方法挂到某个对象原型上 - 内存更省:方法只存一份,在原型对象上,所有实例共享
- 查找不到就停止,逻辑简单透明,引擎优化路径明确
ES6 class 是语法糖,不是范式切换
class 关键字看起来像 Java,但它背后仍是原型链。你写 class B extends A,实际生成的仍是 B.prototype.__proto__ = A.prototype。这说明设计思想从未改变——只是给开发者提供了更熟悉的表达形式,底层委托机制依然健壮、可调试、可干预。
-
new B()创建的对象,__proto__仍指向B.prototype - 静态方法其实是挂载在构造函数本身,而非原型上,但调用链依然遵循原型规则
- 即使用了
class,你仍可以用Object.getPrototypeOf()查看真实链条

















