JavaScript原型链属性访问顺序严格固定:先查实例自身,再沿__proto__逐级向上至Object.prototype,最终到null终止;实例属性(如this.name、类字段)优先级最高,会遮蔽原型链上同名属性;查找只依赖__proto__链,不涉及constructor等其他属性;所有普通对象原型链终点均为Object.prototype→null。

JavaScript 中原型链属性访问顺序是严格固定的:先查实例自身,再逐级沿 __proto__ 向上查找,直到 Object.prototype,最终到 null 停止。这不是推导出来的逻辑,而是引擎运行时真实发生的引用跳转路径。
查找起点永远是实例自身
无论属性是数据、方法还是 getter,访问时第一步永远检查对象自身是否拥有该属性(即 hasOwnProperty 级别判断)。
- 有就直接返回,不继续向上找
- 哪怕原型链上同名属性更早定义、更“权威”,也会被实例属性遮蔽
-
this.name = 'x'、类字段name = 'x'、构造函数里赋值的this.xxx,都属于实例属性,优先级最高
向上跳转只依赖 __proto__ 链
没找到就跳到当前对象的 __proto__ 所指对象,再重复查找——这个过程不看构造函数名、不看 constructor、不走任何捷径。
-
cat.__proto__ === Cat.prototype是引擎强制设置,恒成立 -
Cat.prototype.__proto__ === Object.prototype,因为Cat.prototype是普通对象,由Object构造 -
Object.prototype.__proto__是null,链在此终止
多层继承时路径自然延长
当 Dog.prototype = new Cat(),dog 的查找路径就变成:dog → Cat实例 → Cat.prototype → Object.prototype → null。
立即学习“Java免费学习笔记(深入)”;
- 中间那个
Cat实例是普通对象,它自己的__proto__指向Cat.prototype - 遮蔽只影响查找是否提前结束,不改变链本身结构
- 删除实例属性后,查找自动恢复整条路径
终点明确且唯一
所有普通对象的原型链终点都是 Object.prototype,再往上就是 null。找不到就返回 undefined,不会报错。
- 数组、函数、日期等内置对象也遵循同一规则,只是它们的
__proto__指向各自的原型(如Array.prototype),但最终都会连到Object.prototype - 静态方法查的是
Function.prototype链,和实例原型链分开,不混用
文章来自机圈观察员网,发布者:,转载请注明出处:https://www.jqgcy.com/shoujipingce/123633.html