Верхняя часть графа объекта формируется для поддержания такой же согласованности с ожиданиями, установленными в другом месте спецификации.
Обязательно наступает момент, когда обычные связи объектов нельзя использовать, потому что вы «исчерпали объекты».
Базовое понимание JavaScript приводит нас к тому, что [[Prototype]]
из Object
является прототипом функции, используемой для создания функционального объекта Object
.
Мы ожидаем, что Function
s будет создан с помощью функции 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]]
of Object
is Function.prototype
.
В каком-то смысле мы теперь находимся над Function.prototype
в графе объектов, поэтому для этого значения был выбран специальный экземпляр Object
(«объект-прототип»).
Это означает, что вершину каждой цепи прототипа можно удобно связать с помощью Object.prototype
.
Это, конечно, также соответствует желательному требованию, чтобы все «является объектом».
Object.__proto__.__proto__ === Object.prototype
На данный момент мы должны завершить граф объектов, поэтому мы устанавливаем [[Prototype]]
из Object.prototype
быть null
.
Object.__proto__.__proto__.__proto__ === null
'Объект .__ proto__ === Function.prototype' ... Объект - это функция. 'typeof Object ===" function "' –
... и '__proto__' был добавлен в ECMAScript 6. –
... и причина, по которой функция' Function.prototype' выглядит пустой, состоит в том, что многие прототипы встроенные конструкторы фактически являются экземпляром объекта, который они создают. Например, 'Array.isArray (Array.prototype); // true' (Или, может быть, не совсем экземпляр, но у них есть некоторая связь с конструктором.) –