跳转到主内容
websoft网络软件专家 - 深耕网络技术,打造实用软件!

JavaScript中原型链的查找机制与终点null的意义

JavaScript对象属性查找遵循原型链机制,从自身开始逐级向上访问__proto__直至null终止;null是设计约定的明确终点,确保查找可预测、可终止,防止无限循环。 JavaScript中对象属性查找遵循原型链机制,从自身开始,逐级向上访问
__proto__
(即构造函数的
prototype
),直到找到目标属性或到达终点
null
。这个终点不是“出错”,而是设计上的明确终止信号——它标志着原型链的自然结束,防止无限循环。 原型链的查找过程:一层一层往上问 当读取一个对象的属性时,JS引擎执行如下步骤: 先检查对象自身是否拥有该属性(自有属性) 如果没有,就去它的
__proto__
对象上查找 如果
__proto__
也没有,继续查
__proto__.__proto__
如此递归,直到某一级的
__proto__
为
null
,查找失败,返回
undefined
例如:
let arr = [];
,
arr.toString()
不会在
arr
上直接找到,而是依次经过
Array.prototype → Object.prototype → null
,最终在
Object.prototype.toString
中命中。
null
作为终点:为什么不是
undefined
或
Object.prototype
?
null
被选为终点是语言设计的关键约定: 立即学习 “ Java免费学习笔记(深入) ”; 使用HTML,CSS,JavaScript开发Android应用程序 英文文字pdf版附源文件 如果你了解HTML,CSS和JavaScript,您已经拥有所需的工具开发Android应用程序。本动手本书展示了如何使用这些开源web标准设计和建造,可适应任何Android设备的应用程序 - 无需使用Java。您将学习如何创建一个在您选择的平台的Andr​​oid友好的网络应用程序,然后转换与自由PhoneGap框架到一个原生的Andr​​oid应用程序。了解为什么设备无关的移动应用是未来的潮流,并开始构建应用程序,提供更 下载
Object.prototype.__proto__ === null
,这是唯一一个
__proto__
为
null
的对象 用
null
能清晰区分“查到尽头”和“尚未定义”——
undefined
是值,
null
是空对象引用,语义更准确 若让
Object.prototype
指向自身,会引发无限循环;若设为
undefined
,则无法可靠判断链是否终结(因为属性访问返回
undefined
本身不等于“没找到”) 手动验证原型链与
null
终点 可以用以下代码直观观察链结构:
let obj = {}; console.log(obj.__proto__); // {constructor: ..., toString: ..., ...} console.log(obj.__proto__.__proto__); // null console.log(Object.getPrototypeOf(obj) === Object.prototype); // true console.log(Object.getPrototypeOf(Object.prototype)); // null
注意:
Object.getPrototypeOf
是标准推荐方式,比直接读
__proto__
更安全可靠。所有普通对象的原型链最终都落在此处——
Object.prototype
的
__proto
是
null
,再无后继。 特殊情况:函数对象与
Function.prototype
函数也是对象,但它们的原型链略有不同:
function fn() {}
→
fn.__proto__ === Function.prototype
Function.prototype.__proto__ === Object.prototype
Object.prototype.__proto__ === null
也就是说,即使是函数,最终仍汇入同一终点。这也解释了为何函数也能调用
toString()
、
hasOwnProperty()
等通用方法——它们都来自
Object.prototype
,而这条链以
null
收尾,确保可预测、可终止。

相关文章