Почему Object.prototype.__proto__ === null

В JavaScript нестандартное свойство __ proto__ и функция Object.getPrototypeOf(...) возвращают внутреннее свойство [[Prototype]].

Для всех функций свойство «прототип» является экземпляром Object.prototype, например:

Array.prototype instanceof Object//true

Но не так с Object.prototype:

Object.prototype.__proto__ === null //true
Object.getPrototypeOf( Object.prototype ) === null //true

В документация для разработчиков Mozilla говорит только:

Свойство proto объекта ссылается на тот же объект, что и его внутренний [[Prototype]] (часто называемый «прототипом»), который может быть объектом или, как в случае Object.prototype по умолчанию. .прототип, null .

Было бы более уместно, чтобы Object.prototype.proto или ошибка Object.getPrototypeOf (Object.prototype) возвращали Object.prototype?

Это ошибка? Это нормально? Зачем?


person Scipion    schedule 21.08.2013    source источник
comment
Почему вы ожидаете этого?   -  person SLaks    schedule 21.08.2013
comment
Шаг 4 из [[GetProperty]] никогда не будет истинным, поэтому поиск несуществующего свойства вызовет бесконечный цикл по Object.prototype. Пошаговые тесты для нулевого прототипа, обозначающего вершину цепочки прототипов; без прототипа null цепочка заканчивается петлей.   -  person apsillers    schedule 21.08.2013


Ответы (1)


Цепочка прототипов должна где-то остановиться.

Если бы было Object.getPrototypeOf( Object.prototype ) === Object.prototype, движок JS попадал бы в бесконечный цикл, когда пытался что-то решить из прототипа.

Он будет подниматься по цепочке прототипов до Object.prototype и, если не найдет его там, будет снова подниматься до Object.prototype, до бесконечности.

На самом деле, если вы попытаетесь сделать это самостоятельно, вы получите ошибку:

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

Обратите внимание, что вы также можете создавать свои собственные объекты без [[Prototype]], вызывая Object.create(null).

person SLaks    schedule 21.08.2013