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