JavaScript属性查找严格沿原型链自下而上单向进行,依次检查实例自身、__proto__指向对象,直至Object.prototype(其__proto__为null),未找到返回undefined;可通过hasOwnProperty、in运算符、getPrototypeOf及遍历构造器名定位属性层级,并注意低层同名属性会屏蔽高层定义。

JavaScript 中属性查找是严格按原型链逐级向上的单向过程,不会“跳层”或“跨链”,关键在于理解查找路径和屏蔽规则。
属性查找的完整路径顺序
访问 obj.prop 时,引擎执行以下步骤:
- 先检查
obj自身是否拥有prop(自有属性,Object.hasOwnProperty('prop')为true) - 若无,读取
obj.__proto__,在其上查找prop - 若仍未找到,继续读取
obj.__proto__.__proto__,重复该过程 - 最终抵达
Object.prototype;其__proto__为null,链终止 - 整条链都未命中,返回
undefined
如何判断属性定义在哪一层
有三种实用方法定位归属:
-
用
Object.getPrototypeOf()逐级检查:Object.getPrototypeOf(obj) === Parent.prototype可确认obj直接继承自Parent -
配合
hasOwnProperty和in运算符区分来源:obj.hasOwnProperty('prop')→ 属于实例自身'prop' in obj && !obj.hasOwnProperty('prop')→ 来自某级原型 -
打印完整原型链结构:
let p = obj; while (p) { console.log(p.constructor?.name || 'null'); p = Object.getPrototypeOf(p); }可直观看到从实例到null的每一级构造器名称
注意属性屏蔽带来的“遮蔽效应”
即使高层原型定义了同名属性,只要低层(包括实例自身)设置了该属性,就会屏蔽上方所有同名定义:
Animal.prototype.color = 'brown'Dog.prototype.color = 'black'const dog = new Dog(); dog.color = 'white'- 此时
dog.color是'white'(实例层),查不到Dog.prototype.color或Animal.prototype.color
典型多层链示例与验证
例如:labrador → Dog.prototype → Animal.prototype → Object.prototype → null
labrador.constructor === DogObject.getPrototypeOf(labrador) === Dog.prototypeObject.getPrototypeOf(Dog.prototype) === Animal.prototypeAnimal.prototype.__proto__ === Object.prototypeObject.prototype.__proto__ === null
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











