javascript原型链的核心是属性查找机制:先查对象自身,再沿__proto__逐级向上搜索至object.prototype,最终返回undefined;构造函数的prototype用于共享属性,实例的__proto__指向它;继承通过child.prototype=new parent()实现;object.prototype的__proto__为null,是原型链终点。

JavaScript原型链的核心是“属性查找机制”:当访问一个对象的属性或方法时,引擎不会只看这个对象自己,而是按固定路径逐级向上搜索,直到找到目标或确认不存在。
原型链的查找顺序
每次读取属性(比如 obj.name 或 obj.say())时,JavaScript 严格按以下步骤执行:
- 先检查对象自身是否拥有该属性(即在 obj 的自有属性中查找)
- 没找到,就去 obj.__proto__ 指向的对象里找(也就是它的原型)
- 还没找到,就继续查 obj.__proto__.__proto__(即原型的原型)
- 如此反复,直到抵达 Object.prototype
- 若连 Object.prototype 都没有,最终返回 undefined
构造函数与原型对象的关系
每个函数(非箭头函数)天生带一个 prototype 属性,它是一个普通对象,专门用来存放将来被实例共享的属性和方法。
Java JDK 25 来自 OpenJDK 官方归档,版本为 JDK 25,本条下载地址已指向官方 Windows x64 zip 安装包直链,适合调试旧项目或兼容旧版 Java 运行环境。
- 用 new Fn() 创建实例时,该实例的 __proto__ 会自动指向 Fn.prototype
- Fn.prototype 上默认有一个 constructor 属性,值为 Fn 本身,形成回引
- 所有原型对象本质上也是对象,所以它们也有自己的 __proto__,自然连成一条链
继承是怎么实现的
继承的本质就是让子类实例能沿着原型链访问到父类定义的方法和属性。最基础的方式是:
- 把子类的 prototype 设为父类的一个实例:Child.prototype = new Parent()
- 这样,new Child() 得到的对象,其 __proto__ → Child.prototype → Parent 实例 → Parent.prototype → Object.prototype → null
- 于是子类实例就能调用 Parent.prototype 上的方法,比如 eat()、run()
为什么 Object.prototype 是终点
Object.prototype 是所有对象的终极原型:
- 它本身是通过 new Object() 创建的,所以它的 __proto__ 是 null
- 所有内置对象(如 Array、Function、Date)的原型链最终都会到达这里
- 像 toString()、hasOwnProperty() 这些通用方法,就定义在 Object.prototype 上
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










