JavaScript引擎读取属性时严格按原型链查找:先查实例自有属性,未命中则沿[[Prototype]]链向上,直至null返回undefined;赋值和删除仅作用于实例自身。

JavaScript 引擎访问对象属性时,并不是直接在对象上“翻找”,而是严格遵循一条预设的查找路径——原型链(prototype chain)。这个过程完全自动化,且只发生在运行时属性读取阶段。
属性查找从实例自身开始
当执行 obj.name 这类访问时,引擎第一步永远是检查 obj 自身是否拥有该属性(即是否在对象的自有属性中定义)。如果找到,立即返回值,不继续向上查找。
- 自有属性包括:通过
obj.prop = value、Object.defineProperty()或构造函数中this.prop = value显式添加的属性 - 可通过
Object.hasOwn(obj, 'prop')或旧版obj.hasOwnProperty('prop')判断是否为自有属性
未命中则沿 [[Prototype]] 链逐级向上
若对象自身没有该属性,引擎会读取其内部属性 [[Prototype]](可通过 Object.getPrototypeOf(obj) 获取),跳转到该原型对象,重复查找过程。
-
[[Prototype]]是隐式链接,不是prototype属性(后者仅存在于函数对象上) - 普通对象的
[[Prototype]]默认指向Object.prototype;数组指向Array.prototype;函数指向Function.prototype - 每一步比较都是严格相等(
===),不是名称匹配,而是检查当前对象是否等于目标属性所在的原型
终点是 null,找不到就返回 undefined
查找持续进行,直到某一级原型为 null(即 Object.prototype.__proto__ === null)。此时链终止,整个查找失败,表达式结果为 undefined。
立即学习“Java免费学习笔记(深入)”;
-
toString、valueOf等通用方法就位于Object.prototype上,所以几乎所有对象都能调用它们 - 注意:
instanceof的实现也依赖同一套遍历逻辑——它判断的是Constructor.prototype是否出现在该链中
写入和删除行为不走完整链路
属性访问(读取)是单向向上查找,但赋值(obj.x = 1)和删除(delete obj.x)默认只作用于对象自身:
- 赋值不会修改原型上的同名属性,而是在实例上新建或覆盖自有属性
- 删除也只删自有属性;无法通过
delete删除原型链上的属性 - 若想修改原型上的属性,需显式操作对应原型对象,如
Person.prototype.greet = ...


















