Верхняя часть графа объектов сформирована так, чтобы максимально соответствовать ожиданиям, установленным в других местах спецификации.
Обязательно наступает момент, когда обычные связи объектов не могут использоваться, потому что у вас «исчерпаны объекты».
Базовое понимание JavaScript позволяет нам ожидать, что [[Prototype]]
из Object
будет свойством-прототипом функции, используемой для создания объекта-функции Object
.
Мы ожидаем, что Function
будут созданы с использованием объекта-функции Function
, поэтому...
Object.__proto__ === Function.prototype
Поскольку мы находимся в верхней части графа объектов и хотим поддерживать согласованность ожидаемого поведения, мы настраиваем [[Prototype]]
из Function
на Function.prototype
.
Function.__proto__ === Function.prototype
Таким образом обеспечивая Function instanceof Function === true
.
Мы можем показать, что Function.prototype
является особым объектом-функцией, потому что:
Function.prototype.prototype === undefined
... и каждая пользовательская функция (кроме толстых стрелок) имеет объект в своем свойстве прототипа.
Из-за всего вышеперечисленного:
Object.__proto__ === Function.__proto__
Это может показаться странным, но, как отмечалось ранее, в верхней части графа объектов у нас есть ограниченный набор объектов-кандидатов, на которые можно указать.
Теперь TC-39 нужно было определить, что такое [[Prototype]]
из [[Prototype]]
из Object
. Согласно вышеизложенному мы знаем, что [[Prototype]]
из Object
равно Function.prototype
.
В каком-то смысле мы теперь выше Function.prototype
в графе объектов, поэтому в качестве этого значения был выбран специальный экземпляр Object
("объект-прототип").
Это означает, что вершину каждой цепочки прототипов можно удобно связать с Object.prototype
.
Это, конечно, также отвечает желаемому требованию, что все «является объектом».
Object.__proto__.__proto__ === Object.prototype
На этом этапе нам нужно завершить граф объекта, поэтому мы устанавливаем [[Prototype]]
из Object.prototype
равным null
.
Object.__proto__.__proto__.__proto__ === null
person
Ben Aston
schedule
01.12.2016
Object.__proto__ === Function.prototype
...Объект - это функция.typeof Object === "function"
- person   schedule 02.12.2016__proto__
был добавлен в ECMAScript 6. - person   schedule 02.12.2016Function.prototype
кажется пустой функцией, заключается в том, что многие прототипы встроенных конструкторов на самом деле являются экземплярами объекта, который они создают. Например,Array.isArray(Array.prototype); // true
(Или, может быть, не совсем экземпляр, но они имеют какое-то отношение к конструктору.) - person   schedule 02.12.2016Function.__proto__===Function.prototype
- person Octopus   schedule 02.12.2016Object.__proto__ === Function.prototype
правда иObject.__proto__.__proto__ === Object.prototype
правда прояснили это для меня. Я всегда предполагал, чтоObject
иFunction
находятся на одном уровне иерархии, и что прототипомObject
былObject.prototype
. Если вы хотите добавить какую-то версию своего комментария в качестве ответа, я буду рад отметить ее как лучшую. - person Alan Storm   schedule 02.12.2016