javascript原型链查找本质是自底向上的线性遍历:先查对象自身属性,再逐级沿__proto__向上查找,直到命中或抵达null;__proto__是对象的原型链接,prototype是函数用于指定实例原型的属性;遮蔽时自有属性优先;instanceof通过检查原型链是否包含constructor.prototype判定。

JavaScript 原型链查找,本质是一次自底向上的线性遍历:先查对象自身,再逐级沿 __proto__(或 Object.getPrototypeOf())向上找,直到命中属性或抵达 null。
查找过程的四步执行顺序
每次访问 obj.prop,引擎严格按以下顺序判断:
- 检查
obj是否自有该属性(通过Object.prototype.hasOwnProperty.call(obj, 'prop')) - 若无,获取
Object.getPrototypeOf(obj),在返回的对象上重复第一步 - 若仍无,继续对上一级原型调用
Object.getPrototypeOf() - 当某级原型返回
null(即到达Object.prototype.__proto__),停止查找,返回undefined
__proto__ 与 prototype 的角色分工
二者不可互换,职责明确:
-
prototype是函数对象独有的属性,指向一个普通对象,用于规定“将来用new调用它时,实例的__proto__应该是谁” -
__proto__是每个对象(包括函数)都有的内部链接,指向它的直接原型对象 - 例如:
const arr = []→arr.__proto__ === Array.prototype;而Array.prototype.__proto__ === Object.prototype
遮蔽(Property Shadowing)如何影响查找
当实例上定义了与原型同名的属性,会中断向上查找:
-
Person.prototype.name = 'human',const p = new Person(),此时p.name返回'human'(从原型链找到) - 执行
p.name = 'Alice'后,p.name立即返回'Alice'(自有属性优先) - 执行
delete p.name后,再次访问p.name就会重新沿原型链查找,恢复为'human'
instanceof 的判定原理也基于此链
a instanceof B 并非比对构造函数名,而是真实地在原型链中查找引用:
-
[] instanceof Array→true,因为[].__proto__ === Array.prototype -
{} instanceof Array→false,因为{}.__proto__ === Object.prototype,不等于Array.prototype - 只要在
a的原型链中某处严格等于B.prototype,结果就是true
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











