javascript 属性查找严格按__proto__构成的单向原型链向上逐级搜索:先查自有属性,未找到则跳转__proto__指向的对象,直至null;__proto__是真实对象引用而非字符串;遮蔽会截断查找,写操作不沿链,读操作才完整遍历;推荐用object.getprototypeof等标准api替代__proto__。

JavaScript 引擎查属性,不是“猜”,也不是“遍历所有对象”,而是严格按一条单向链路一级级跳转——这条链就是由 __proto__ 串起来的原型链。
属性查找走的是单向向上链路
每次读取 obj.prop,引擎内部执行的是确定性步骤:
- 先检查
obj自身是否含有prop(自有属性),有就直接返回 - 没有,就立刻跳到
obj.__proto__指向的对象上找 - 还在没找到?再跳到
obj.__proto__.__proto__上找 - 如此反复,直到某一级的
__proto__是null(即到达Object.prototype顶端),终止查找,返回undefined
__proto__ 不是字符串名,而是真实引用
__proto__ 是每个对象都有的内部链接,它不存储名字,而直接保存另一个对象的内存地址。比如:
-
const arr = [];→arr.__proto__就是Array.prototype这个对象本身 -
Array.prototype.__proto__就是Object.prototype这个对象本身 -
Object.prototype.__proto__ === null,链在此真正断开
引擎不做名称匹配,只做引用比对。所以 instanceof 能准确判断,靠的正是这种对象级的链路存在性检查。
如果你了解HTML,CSS和JavaScript,您已经拥有所需的工具开发Android应用程序。本动手本书展示了如何使用这些开源web标准设计和建造,可适应任何Android设备的应用程序 - 无需使用Java。您将学习如何创建一个在您选择的平台的Android友好的网络应用程序,然后转换与自由PhoneGap框架到一个原生的Android应用程序。了解为什么设备无关的移动应用是未来的潮流,并开始构建应用程序,提供更
遮蔽会提前截断查找路径
如果在实例上写了同名属性,比如 arr.length = 100,这个 length 就会成为 arr 自有的属性。之后再读 arr.length,引擎根本不会往下走 __proto__,因为第一步就在自身找到了。
- 写操作从不沿链查找:赋值永远发生在当前对象,哪怕原型上已有同名属性
- 读操作才走完整链路:只有读不到时,才一级级往上跳
- 删除自有属性后,读操作自动恢复走原型链,无需手动“刷新”
用标准方式替代 __proto__ 更稳妥
__proto__ 是非标准但被广泛支持的访问器。生产环境推荐用标准 API:
- 读原型:
Object.getPrototypeOf(obj)(等价于obj.__proto__) - 设原型:
Object.setPrototypeOf(obj, proto)(慎用,性能差) - 创建带指定原型的对象:
Object.create(proto)
这些方法操作的都是同一个底层 [[Prototype]] 内部槽位,只是接口更规范、行为更可预测。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










