javascript属性查找沿原型链逐级向上搜索,先查自有属性,再依次查__proto__指向的原型对象,直至null;__proto__是对象的原型链接,prototype是函数用于指定实例原型的属性;遮蔽发生时自有属性优先;instanceof通过检查原型链是否包含constructor.prototype来判断。

JavaScript 属性查找的核心原理,就是沿着原型链逐级向上搜索的过程。它不依赖“类”的继承结构,而是靠对象内部的 [[Prototype]] 链接关系实现——查不到就往原型上找,直到找到或抵达 null。
属性查找四步规则
每次访问一个对象的属性(如 obj.name),引擎按以下顺序执行:
- 先检查对象自身是否拥有该属性(自有属性)
- 如果没有,就去 obj.__proto__ 指向的对象上查找
- 如果还没找到,继续顺着 __proto__ 向上跳转(比如到 Array.prototype 或 Object.prototype)
- 最终到达 Object.prototype.__proto__ === null,查找终止,返回 undefined
理解 __proto__ 与 prototype 的分工
这两个属性常被混淆,但职责清晰:
Java Maven 项目审查工作流的通用输入处理。当 Java Maven 项目以 ZIP压缩包或 GitLab 仓库 URL 形式提供且需要...时使用。
- prototype 是函数对象独有的属性,指向一个对象,用于规定“将来用 new 调用它时,实例的原型该是谁”
- __proto__ 是每个对象(包括函数)都有的内部链接,指向它的直接原型(即创建它的构造函数的 prototype)
- 例如:const arr = []; → arr.__proto__ === Array.prototype,而 Array.prototype.__proto__ === Object.prototype
遮蔽(Property Shadowing)是常见干扰项
当实例上定义了和原型同名的属性,就会“遮住”原型上的那个,导致查找提前结束:
- Person.prototype.species = 'Homo sapiens';
- const p = new Person();
- p.species = 'Engineer'; // 此时 p.species 不再沿链查找,直接返回 'Engineer'
- 删除后:delete p.species;,再次访问 p.species 就会重新走原型链,得到 'Homo sapiens'
instanceof 的底层逻辑也基于原型链
a instanceof B 实际是在检查:a 的原型链中,是否存在 B.prototype 这个对象:
- [] instanceof Array → true,因为 [].__proto__ === Array.prototype
- {} instanceof Array → false,因为 {}.__proto__ === Object.prototype,不等于 Array.prototype
- 它不是比构造函数名,而是实实在在地在链上做对象引用比对
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










