JavaScript中所有对象的原型链顶端是否指向同一Prototype Object?
所有JavaScript对象的原型链顶端都指向同一个对象原型吗?
从你贴的代码结果来看,这个结论大部分情况下是成立的,但要注意存在几个特殊例外。
先分析你的代码验证逻辑
你写的代码覆盖了几种常见的JavaScript值/对象类型,它们的原型链最终都指向了同一个Object.prototype:
- 原始值
a=10会被自动包装为Number对象,原型链是:Number实例 → Number.prototype → Object.prototype → null - 字面量对象
b和new Object()创建的c,原型链直接是:对象实例 → Object.prototype → null - 普通函数
fun的prototype属性是一个默认的普通对象,它的原型链同样指向Object.prototype
所以你看到的几个console.log都返回true,核心原因就是它们最终都指向了全局唯一的Object.prototype,而Object.prototype的原型是null——这就是JavaScript原型链的顶端终点。
例外情况:并非所有对象都遵循这个规则
最典型的反例是用Object.create(null)创建的对象:
const noProtoObj = Object.create(null); console.log(noProtoObj.__proto__); // undefined console.log(Object.getPrototypeOf(noProtoObj)); // null
这个对象没有任何原型,它的原型链直接终止于null,完全不经过Object.prototype,因此它不会继承Object.prototype上的任何方法(比如toString()、hasOwnProperty()),这在需要避免原型污染的场景中很有用。
另外,部分引擎内部的特殊对象(比如早期环境中的arguments对象)可能也存在特殊的原型链实现,但现代引擎已经基本将这类对象标准化,日常开发中最常见的例外就是Object.create(null)创建的“无原型对象”。
总结
日常开发中遇到的绝大多数对象,原型链顶端都是Object.prototype,这一点和Java中所有对象继承自Object类的逻辑非常相似,但要记住Object.create(null)这种特殊情况,它打破了这个通用规则。
内容的提问来源于stack exchange,提问作者Jaikaran saini
相关产品推荐
相关产品推荐

