JavaScript对象属性继承顺序即原型链查找顺序:从实例自身开始,逐级向上遍历__proto__直至null;实例属性优先遮蔽原型属性,类继承时按B.prototype→A.prototype→Object.prototype线性查找。

JavaScript中对象属性的继承顺序,本质就是原型链查找顺序:从当前对象自身开始,逐级向上遍历其原型,直到找到属性或抵达null为止。它不看“谁先定义”,只看“谁更靠近实例”。
属性查找严格走原型链,不走作用域链
每次访问obj.prop时,引擎执行的是线性向上的搜索:
- 先检查
obj.hasOwnProperty('prop')是否为true(即实例自身拥有该属性) - 没找到?去
obj.__proto__(也就是obj.constructor.prototype)上找 - 还没找到?继续查
obj.__proto__.__proto__ - 最终停在
Object.prototype.__proto__ === null,返回undefined
实例属性永远优先于原型属性(遮蔽机制)
只要实例上有同名属性,不管原型上有没有、定义得多早,都会被“遮蔽”:
Person.prototype.name = 'unknown';-
const p = new Person('Alice');→p.name返回'Alice' -
delete p.name;后,p.name才回落到原型值'unknown'
这个规则对数据属性、方法、getter/setter全部适用。
立即学习“Java免费学习笔记(深入)”;
类继承下的实际查找路径
使用class B extends A时,实例new B()的原型链是:
-
B.prototype(子类实例方法入口) - →
A.prototype(父类方法) - →
Object.prototype(顶层)
调用b.method()时,引擎按此顺序查找第一个匹配的method,不会跳过B.prototype直接去A.prototype。
注意:属性顺序 ≠ 查找顺序
ES6+中for...in或Object.keys()的遍历顺序(数值键→字符串插入序→Symbol插入序)和继承查找顺序无关。继承查的是“有没有”,不是“谁在前”。继承来的属性即使排在遍历结果最后,只要在原型链上更近,就一定先被访问到。


















