javascript原型链属性查找失败返回undefined,是[[get]]遍历至[[prototype]]为null仍未匹配时的默认终止结果,并非主动抛出;该行为由ecmascript规范定义,确保静默失败以提升健壮性。

JavaScript 原型链中属性查找失败时最终返回 undefined,这不是某一级主动“抛出”或“赋值”的结果,而是整个 [[Get]] 内部方法执行流程自然终止后的默认行为。
属性访问触发 [[Get]] 内部方法
当你写 obj.prop 或 obj['prop'],引擎实际调用的是对象的内部方法 [[Get]]。它按固定顺序执行,不跳过、不猜测:
- 先检查当前对象自身是否拥有该属性(含数据属性、访问器属性、可枚举或不可枚举)
- 如果找到,立即返回对应值(对 getter 会执行其 get 函数)
- 如果没找到,且当前对象的 [[Prototype]] 不为 null,则把查找任务交给它的原型,递归调用 [[Get]]
- 一旦遇到 [[Prototype]] === null(例如 Object.prototype 的上一级),且仍未匹配,查找停止,返回 undefined
原型链终点是 null,不是 Object.prototype
很多人误以为原型链止于 Object.prototype,其实它的 [[Prototype]] 值就是 null:
Object.getPrototypeOf(Object.prototype) === null // true
你接手一个需求时,是不是经常这样:"改一个小字段 → 结果把不相关的代码也改了"、"需求说得很模糊 → 做着做着发现跑偏了"、"数据库加个字段 → 上线才发现漏了数据兼容"、"做了个新功能 → 一个月后自己都忘了当时怎么设计的"、"写到一半被中断 → 再回来不知道从哪继续";这个 Skill 就是专门解决这些问题的。 它会自动探测你的项目环境(JDK、Spring Boot、ORM、数据库、前端框架),记在
所以完整链条是:obj → obj.__proto__ → … → Object.prototype → null。[[Get]] 走到 null 还没找到,就收尾,不报错也不继续。
和 in 操作符、Proxy、getter 的区别
这个 undefined 返回机制有明确边界,不能混淆:
-
'prop' in obj只判断存在性,不触发 [[Get]],查不到也返回false,不是undefined - 如果某级原型定义了
get prop() { return undefined; },那是显式返回,属于主动逻辑,和“查找失败”无关 - Proxy 的
gettrap 可完全接管,返回任意值甚至 throw,此时原生链式查找被跳过
这是规范设计的选择,不是实现缺陷
ECMAScript 明确规定:[[Get]] 遍历至原型链末端无匹配时,静默返回 undefined。这种“失败不中断”的策略让属性访问更健壮,避免大量 try/catch 或存在性校验。它不是妥协,而是有意为之的语言特性。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










