JavaScript原型链属性查找是自下而上的按需搜索:先查对象自身,存在则立即返回;否则沿[[Prototype]]逐级向上,终点为Object.prototype.__proto__ === null。

JavaScript 中原型链的属性查找,本质是一次确定、可预测的“自下而上”搜索过程——它不预加载整条链,也不复制属性,而是按需逐级跳转,直到找到或走到底。
查找从对象自身开始
每次访问 obj.prop,引擎第一件事就是检查 obj 自身是否拥有该属性(包括不可枚举属性)。只要存在,立刻返回值,完全不会进入原型链。只有查不到时,才启动向上查找。
找不到就跳到 __proto__ 指向的对象
引擎会读取 obj.__proto(即内部 [[Prototype]]),把查找目标切换到那个对象上。这个跳转是单向、只读的,推荐用 Object.getPrototypeOf(obj) 替代 __proto__ 获取更规范。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 如果新对象上有该属性,直接返回
- 如果没有,继续读取它的
__proto__,再跳一级 - 重复这个过程,边找边跳,不是一次性构建整条链
终点固定:Object.prototype.__proto__ === null
所有普通对象的原型链最终都会连到 Object.prototype,而它的 __proto__ 是 null,这就是链的终止信号。
立即学习“Java免费学习笔记(深入)”;
-
[1, 2, 3]的查找路径:数组实例 → Array.prototype → Object.prototype → null -
function f(){}的路径:函数实例 → Function.prototype → Object.prototype → null - 无论对象怎么创建(
{}、new Date()、Object.create({})),终点都是同一个Object.prototype
继承和共享靠的是这条查找路径
你往 Person.prototype 上添加方法,new Person() 创建的所有实例都能调用,不是因为它们“继承了代码”,而是因为它们的 __proto__ 都指向 Person.prototype,访问方法时自然会顺着链找到那里。
- 修改原型上的属性,会影响所有通过该链访问它的实例
- 在实例上赋值同名属性,会遮蔽原型上的属性(即“就近原则”)
- 用
in操作符可检测是否在自身或原型链上存在;hasOwnProperty只查自身

















