JavaScript原型链是属性查找的按需向上追溯路径:先查对象自身,再沿__proto__逐级向上,直至Object.prototype或null;__proto__是对象的原型链接,prototype是函数用于指定实例原型的对象;遮蔽会中断查找;instanceof通过检查原型链是否包含B.prototype来判断。

JavaScript 中原型链在对象属性查找时,本质是一条按需向上追溯的路径:先查自己,再顺着 __proto__ 一级级往上找,直到找到属性,或抵达 Object.prototype.__proto__ === null 终止。
属性查找严格遵循四步顺序
每次访问如 obj.name 或 obj.method(),引擎执行以下动作:
- 检查
obj自身是否定义了该属性(自有属性,优先级最高) - 未命中,则访问
obj.__proto__指向的对象(即构造函数的prototype),在其上查找 - 仍没找到,继续访问
obj.__proto__.__proto__,也就是上一级原型 - 反复跳转,最终停在
Object.prototype;若它也没有,且其__proto__为null,则返回undefined
__proto__ 和 prototype 不是同一回事
这两个属性分工明确,混淆会导致理解偏差:
Java Maven 项目审查工作流的通用输入处理。当 Java Maven 项目以 ZIP压缩包或 GitLab 仓库 URL 形式提供且需要...时使用。
-
prototype是函数独有的属性,指向一个对象,用于规定“将来用new创建实例时,那些实例的__proto__应该连向谁” -
__proto__是每个对象(包括函数)都有的内部链接,指向它的直接原型 —— 即创建它的构造函数的prototype - 例如:
const arr = []→arr.__proto__ === Array.prototype;而Array.prototype.__proto__ === Object.prototype
遮蔽(Shadowing)会中断查找过程
当实例自身添加了与原型同名的属性,就会“盖住”原型上的同名属性,查找不再向上:
立即学习“Java免费学习笔记(深入)”;
Person.prototype.species = 'Homo sapiens'-
const p = new Person(),此时p.species返回'Homo sapiens' - 但一旦执行
p.species = 'Engineer',后续访问p.species就直接返回'Engineer',不再查原型 - 用
delete p.species删除后,查找恢复原链,再次取到'Homo sapiens'
instanceof 的判断也依赖原型链
表达式 a instanceof B 并非比对构造函数名,而是真实遍历 a 的原型链:
- 检查
B.prototype这个对象,是否出现在a的__proto__链中 -
[] instanceof Array为true,因为[].__proto__ === Array.prototype -
{} instanceof Array为false,因为{}.__proto__ === Object.prototype,不等于Array.prototype

















