Свойство prototype
функции содержит объект, из которого все экземпляры этой функции наследуются при создании с помощью оператора new
. И все эти объекты-прототипы (обычно) имеют свойство constructor
, которое указывает на функцию - там вы имеете круглую ссылку. Таким образом, как свойство new test()
наследует это свойство, (new test).constructor === test
оценивается как true
.
Вам нужно будет различать свойство prototype
объекта функции и объекта-прототипа, из которого объект наследует - часто ссылается как «внутреннее свойство [[prototype]]
».
Конструктор - это функция, не говорящая о Function
, и имеет и то, и другое. Поэтому он наследует от объекта Function.prototype
, где свойство constructor
говорит, что все функции построены конструктором Function
. Если ваша консоль разработчиков покажет прототип объектов Function
, вы можете их увидеть. Я думаю, что в настройках есть опция.
Итак, знаменитая «цепочка прототипов» относится не к свойствам constructor
и / или prototype
, а о прототипе объекта, из которого этот объект наследуется от:
function test() {} new test()
(a Function) (a test instance)
|| ||
|| ||
\/ \/
Function.prototype test.prototype
(a Function, by spec) (an Object)
|| ||
|| ||
\/ \/
Object.prototype Object.prototype
|| ||
|| ||
\/ \/
null null