Почему функции-конструкторы в Javascript не имеют прототипа Function?

Я изучаю Javascript и недавно немного узнал о прототипах. Мое понимание прототипов состоит в том, что они буквально являются объектами в памяти, на которые каждый вновь созданный объект имеет указатель. Когда создается новый объект, функция-конструктор, используемая для создания этого объекта, назначает прототип вновь созданного объекта прототипом функции-конструктора. Другими словами, если у меня есть функция-конструктор Circle и я создаю новый объект Circle, этот новый объект и функция-конструктор Circle указывают на одну и ту же ссылку.

Мой вопрос: если предполагается, что прототипы ссылаются на «родительский» объект, который создал объект, например, на функцию-конструктор, почему функции-конструкторы, которые являются функциями и, следовательно, объектами, не указывают на конструктор «Функция» как на их прототип ? Если вы попытаетесь создать новый конструктор следующим образом:

function Circle() {}
let c1 = new Circle();

Вы увидите, что c1 имеет следующий прототип в качестве прототипа, что имеет смысл, поскольку конструктор Circle создал его.

Circle {}
__proto__:
constructor: ƒ Circle()
__proto__: Object

и Circle.prototype — это тот же объект, что и выше. Так почему же Circle.prototype не указывает на Function как на прототип?


person Jeremy Fisher    schedule 31.03.2020    source источник
comment
Вы путаете Circle.prototype и Object.getPrototypeOf(Circle), последнее из которых равно равно Function.prototype.   -  person Patrick Roberts    schedule 31.03.2020
comment
Будьте очень осторожны с использованием консоли браузера для изучения вещей. Это может быть очень запутанным; он пытается быть полезным, но для людей, незнакомых с языком, это может быть проблемой.   -  person Pointy    schedule 31.03.2020
comment
Прототип — это объект, поскольку он имеет свойства. Конечно, функция также является объектом, но прототипы обычно не являются функциями. Кроме того, экземпляр создан не функцией-конструктором — вы объединяете Circle.prototype и Circle.prototype.constructor   -  person VLAZ    schedule 31.03.2020


Ответы (1)


Как вы заметили, это true:

Object.getPrototypeOf(c1) === Circle.prototype

Отсюда логически следует, что если мы считаем Circle экземпляром Function, то:

Object.getPrototypeOf(Circle) === Function.prototype

Вы можете подтвердить это ниже:

// let Circle = new Function(); /* also works here */
function Circle() {}
let c1 = new Circle();

console.log(Object.getPrototypeOf(c1) === Circle.prototype);
console.log(Object.getPrototypeOf(Circle) === Function.prototype);

Метод Object.getPrototypeOf() возвращает прототип (т. е. значение внутреннего свойства [[Prototype]]) указанного объекта.

Не путать с Circle.prototype. Подробнее о различиях между ними можно прочитать в статье MDN об объекте. прототипы или не стесняйтесь просматривать любые ответы на __proto__ VS. прототип в JavaScript.

Обратите внимание, что Circle.__proto__ и Object.getPrototypeOf(Circle) эквивалентны, а __proto__ нестандартен (даже несмотря на то, что он определен почти во всех реализациях JavaScript из-за его исторического использования для обратной совместимости).

person Patrick Roberts    schedule 31.03.2020