Нет, prototype
всегда имеет свойство constructor
, которое указывает на функцию, прототипом которой он является. И, конечно, он также наследуется от объекта, то есть внутреннего свойства __proto__
.
Он определен в ECMAScript 5, раздел 13.2, Создание объектов функций :
(...)
16. Пусть proto будет результатом создания нового объекта, как было бы построено выражением new Object()
, где Object
- это стандартный встроенный конструктор с таким именем .
17. Вызвать внутренний метод [[DefineOwnProperty]] для proto с аргументами "constructor"
, Дескриптор свойства {[[Value]]: F , {[[Writable] ]]: true, [[Enumerable]]: false, [[Configurable]]: true} и false.
18. Вызвать внутренний метод [[DefineOwnProperty]] для F с аргументами "prototype"
, Дескриптор свойства {[[Value]]: proto , {[[Writable] ]]: true, [[Enumerable]]: false, [[Configurable]]: false} и false.
(...)
Это означает не что иное, как:
Создайте новый пустой объект с именем proto (16). Определите свойство constructor
для этого объекта и установите значение F (сама функция) (17). Затем определите свойство prototype
в функции F и установите для него значение proto .
Если вы alert
объект, то объект преобразуется в строку. Поведение по умолчанию заключается в преобразовании объекта в строку [object Object]
, если только «специальный» метод toString
не переопределен.
Консоль Chrome перечисляет эти свойства, потому что она предназначена для отладки, поэтому вам нужна информация. [object Object]
не очень информативно.
FWIW, пустой объект выглядит так:
![empty object](https://i.stack.imgur.com/1OcMQ.png)
Вы также можете увидеть внутреннее свойство __proto__
здесь. Пустой объект всегда наследует некоторые свойства по умолчанию, но у него нет собственных свойств.