原型链是javascript继承的唯一原生基础,通过__proto__隐式连接实现方法共享与属性查找,所有对象最终继承自object.prototype,es6 class仅为语法糖,底层仍依赖原型链机制。

原型链是 JavaScript 继承体系的唯一原生基础,没有它,就没有真正的对象间复用与方法共享。
原型链是继承发生的实际路径
JavaScript 不靠“类声明”实现继承,而是靠对象之间隐式连接的查找链条。当调用 obj.method() 时,引擎并不关心 obj 是不是某个“类”的实例,只按固定路线找:obj 自身 → obj.__proto__ → obj.__proto__.__proto__ → … → Object.prototype → null。这条路线就是继承生效的地方。
- 父类方法不在子实例上,但在它的原型链某一级上,调用依然成功
- 修改父构造函数 prototype 上的方法,所有已存在和未来创建的子实例立即生效
- 属性屏蔽(shadowing)也依赖该机制:给实例加同名属性,会阻断原型链上的同名访问
构造函数只是建立原型链的工具
function Parent(){} 和 function Child(){} 本身不构成继承关系。真正起作用的是赋值语句:Child.prototype = new Parent() 或更规范的 Child.prototype = Object.create(Parent.prototype)。这步操作让所有 Child 实例的 __proto__ 指向一个拥有 Parent 实例特征的对象,从而接入 Parent 的原型链。
Java JDK 25 来自 OpenJDK 官方归档,版本为 JDK 25,本条下载地址已指向官方 Windows x64 zip 安装包直链,适合调试旧项目或兼容旧版 Java 运行环境。
- 必须手动修复 constructor,否则 Child.prototype.constructor 会指向 Parent
- 直接赋值 new Parent() 有风险:若 Parent 构造函数有副作用(如发请求、改状态),会在设置原型时提前触发
- Object.create 更安全,只继承原型,不执行父构造逻辑
所有内置类型都统一在这条链上
Array、Date、RegExp 等内置构造函数,其原型最终都连到 Object.prototype。比如 [] instanceof Array 为 true,[] instanceof Object 也为 true,因为 Array.prototype.__proto__ === Object.prototype。这种统一性让 typeof、instanceof、hasOwnProperty 等判断有据可依,也让 polyfill 和兼容处理成为可能。
- Object.prototype 是链的终点,它的 __proto__ 是 null
- toString、valueOf、hasOwnProperty 这些通用方法,全部来自 Object.prototype
- 自定义类型若想被正确识别,必须确保原型链最终通向 Object.prototype
ES6 class 并未改变底层逻辑
class Cat extends Animal 写法很像传统面向对象,但编译后仍是基于 prototype 和 __proto__ 的赋值与链接。extends 关键字本质是调用 Object.setPrototypeOf(Child.prototype, Parent.prototype),再配合 super() 初始化 this。语法糖简化了写法,没绕过原型链——反而让开发者更容易忽略它,导致调试困难。
- class 内部方法默认不可枚举,但仍在原型上,不是实例自有属性
- static 方法挂在构造函数本身,不参与原型链查找
- 箭头函数在 class 中不绑定原型,因为它没有 prototype 属性
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










