2016-12-01 7 views
6

В javascript Google Chrom объекты имеют свойство с именем __proto__, которое указывает на их прототип (или родительский) объект.Что находится в Object .__ proto__?

var foo = {}; 
console.log(foo.__proto__ === Object.prototype); //returns true 

Однако, это не так для Object объекта.

console.log(Object.__proto__ === Object.prototype); //returns false 

Object.__proto__ свойства, как представляется пустой метод

> console.log(Object.__proto__.toString()); 
function() {} 

Помимо выступающим в качестве предупреждения истории о опираясь на яваскрипт функций, которые начинаются за пределами стандартных органов - что функция Object.__proto__?

+4

'Объект .__ proto__ === Function.prototype' ... Объект - это функция. 'typeof Object ===" function "' –

+0

... и '__proto__' был добавлен в ECMAScript 6. –

+0

... и причина, по которой функция' Function.prototype' выглядит пустой, состоит в том, что многие прототипы встроенные конструкторы фактически являются экземпляром объекта, который они создают. Например, 'Array.isArray (Array.prototype); // true' (Или, может быть, не совсем экземпляр, но у них есть некоторая связь с конструктором.) –

ответ

2

основе squint's комментарии выше, я был в состоянии добраться до нижней части этого. Мое неустановленное, неправильное (и более 10 лет) предположение состояло в том, что глобальный объект-объект-объект-объектный объект Object был также «прототипом прототипов» верхнего уровня в верхней/конце прототипа javascript. Это неправда.

Object вспомогательный объект и Function вспомогательный объект оба имеют тот же самый родительский прототипах объект

console.log(Object.__proto__ === Function.__proto__); //true 

Так что, причина Object.__proto__ указывает на пустой функции - это пустая функция является его прототип объекта для объекта Object. Если вы хотите добраться до прототипа прототипов от Object (без использования .prototype), вам нужно снова откопать его.

console.log(Object.__proto__.__proto__ === Object.prototype);   //true 

Я также соединить быструю диаграмму, отображающую из реальных прототипов нескольких объектов хелперов/конструктора нижнего уровня в JavaScript.

enter image description here

Наконец - я также обнаружил, Google Chrome реализовал Reflect объект, which includes a getPrototypeOf method, который, как представляется, быть таким же, как метод Object.getPrototypeOf.

+0

Re: down-voters - если что-то выше неверно, пожалуйста, дайте мне знать. Если это правильно, но вам не нравится моя точка зрения - я думаю, я буду жить с downvotes;) –

+0

Я думаю, что вы «Правильно, но график запутан, потому что я ожидаю, что стрелки будут указывать на другое направление (направление наследования). И это предложение вводит в заблуждение: * «Объектный объект-помощник совместно использует свой прототип с помощью вспомогательного объекта Function». * Фраза расплывчата. Я не могу сказать, когда вы говорите о функциях конструктора, их '.prototype' или объекте, из которого они наследуются (который доступен через' __proto__'). Таким образом, это может быть частью причины для DV. –

+0

'getPrototypeOf' является новым с объектом' Reflect', но он довольно долго работает через 'Object.getPrototypeOf'. По крайней мере, я думаю, что они одинаковы. На самом деле не слишком много смотрели на «Reflect». EDIT: Я вижу в документах, что они действительно то же самое. Хорошо. –

6

Верхняя часть графа объекта формируется для поддержания такой же согласованности с ожиданиями, установленными в другом месте спецификации.

Обязательно наступает момент, когда обычные связи объектов нельзя использовать, потому что вы «исчерпали объекты».

Базовое понимание 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 
+0

Полезная информация @BenAston - спасибо! но я не уверен, что информация 'Object .__ proto__' верна? 'Object .__ proto __. ToString()' возвращает '" function() {} "' - то есть пустую функцию, ** не ** функцию '[native code]' (Chrome, OS X El Cap)? Re: Внешние стандартные тела, мое утверждение/snark было неясно. Я понимаю, что __proto__ был реализован в браузерах, несмотря на то, что он не был частью стандарта ES и недавно был включен в стандарт ES6. –

+0

Предоставление 'Object .__ proto__.toString() 'будет зависеть от версии вашего браузера. Кроме того: вы хотите, чтобы 'toString' распечатывал исходный код C++? Если вы мне не верите: скажите мне, какая функция пользовательской земли создала встроенный объект-объект 'Object'? – Ben

+0

Причина, по которой я не уверен, что ваше описание на 100% точнее, если я зарегистрирую функцию с собственным кодом в браузере Chrome (или использую метод toString), я получаю то, что упоминает [собственный код] ('split split() {[native code]} '. Однако, когда Chrome (или' .toString') отображает объект Object .__ proto__', он не содержит собственный код и выглядит как пустая пользовательская наземная функция ('function() {} ') –