Javascript 为什么是Object.prototype.\uuu proto\uuu==null

Javascript 为什么是Object.prototype.\uuu proto\uuu==null,javascript,ecmascript-5,Javascript,Ecmascript 5,在JavaScript中,非标准属性_uuuproto_uu和函数Object.getPrototypeOf(…)返回内部属性[[Prototype]] 对于所有函数,属性“prototype”都是Object.prototype的实例,例如: Array.prototype instanceof Object//true 但Object.prototype的情况并非如此: Object.prototype.__proto__ === null //true Object.getPrototy

在JavaScript中,非标准属性_uuuproto_uu和函数Object.getPrototypeOf(…)返回内部属性[[Prototype]]

对于所有函数,属性“prototype”都是Object.prototype的实例,例如:

Array.prototype instanceof Object//true
但Object.prototype的情况并非如此:

Object.prototype.__proto__ === null //true
Object.getPrototypeOf( Object.prototype ) === null //true
只说:

对象的proto属性引用与其属性相同的对象 内部[[原型]](通常称为“原型”),其 可以是对象,也可以是默认情况下的 Object.prototype.proto,空

是更适合Object.prototype.proto还是失败的Object.getPrototypeOf(Object.prototype)返回Object.prototype


这是虫子吗?这样行吗?为什么?

原型链必须停在某个地方

如果JS引擎拥有
Object.getPrototypeOf(Object.prototype)==Object.prototype
,那么当它试图从原型解析某些内容时,就会陷入无限循环

它将沿着原型链走到
对象。原型
,如果在那里找不到它,它将进一步走到
对象。原型
,再次无限

事实上,如果你自己尝试这样做,你会得到一个错误:

> Object.prototype.__proto__ = Object.prototype
Error: Cyclic __proto__ value


请注意,您也可以通过调用
对象来创建自己的对象,而不使用
[[Prototype]]
。创建(null)

原型链必须在某处停止

如果JS引擎拥有
Object.getPrototypeOf(Object.prototype)==Object.prototype
,那么当它试图从原型解析某些内容时,就会陷入无限循环

它将沿着原型链走到
对象。原型
,如果在那里找不到它,它将进一步走到
对象。原型
,再次无限

事实上,如果你自己尝试这样做,你会得到一个错误:

> Object.prototype.__proto__ = Object.prototype
Error: Cyclic __proto__ value


请注意,您也可以通过调用
对象来创建自己的对象,而不使用
[[Prototype]]
。创建(null)

为什么会这样?的步骤4永远不会是真的,因此查找不存在的属性将导致对
对象的无限循环。Prototype
。步骤测试零原型,表示原型链的顶部;如果没有
null
原型,链将以循环结束。为什么会这样?的步骤4永远不会为真,因此查找不存在的属性将导致
对象上的无限循环。原型
。步骤测试零原型,表示原型链的顶部;如果没有
null
原型,链将以循环结束。