不能验证 object.prototype.__proto__ === null,因为 proto 是非标准、已废弃的访问器属性,其行为在不同引擎中不一致,而 object.prototype 的 [[prototype]] 内部槽为 null,应使用 object.getprototypeof() 安全读取。

JavaScript 中无法直接验证 Object.prototype.__proto__ 为 null,因为该属性在规范中**本就不应被访问**,且现代环境已明确弃用、行为不一致,甚至可能抛错。
为什么不能(也不该)验证 Object.prototype.__proto__ === null
__proto__ 是非标准、已废弃的访问器属性,仅作为历史兼容存在。ECMAScript 规范从未定义 Object.prototype.__proto__ 的值,而是规定:
-
Object.prototype是原型链的终点,其内部 [[Prototype]] 指针为null; - 这个
null是内部状态,不是某个对象的__proto__属性值; - 对
Object.prototype.__proto__的读取,在不同引擎中表现不一:Chrome/V8 返回null(但属实现细节),Firefox 可能返回undefined或抛TypeError,Safari 可能拒绝访问。
正确方式:用 Object.getPrototypeOf() 向上遍历至 null
要验证原型链是否终止于 null,应使用标准、可靠的方法:
- 调用
Object.getPrototypeOf(obj)获取对象的显式原型; - 对
Object.prototype调用它,结果应为null; - 这是唯一被规范保证的行为。
示例:
验证任意对象原型链是否合法终止
可写一个通用函数,沿原型链向上检查是否最终到达 null:
if (obj == null) return true;
let p = obj;
while (p !== null) {
p = Object.getPrototypeOf(p);
}
return p === null;
}
该函数不会依赖 __proto__,适用于所有标准环境。
注意:不要混淆 __proto__ 和 [[Prototype]]
__proto__ 是一个可被污染、非标准的 getter/setter;[[Prototype]] 才是对象真正的内部原型引用。你关心的“底层为 null”,实质是 [[Prototype]] 内部槽的值 —— 它只能通过 Object.getPrototypeOf() 安全读取,或通过 Object.setPrototypeOf() 安全设置(不推荐改 Object.prototype)。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











