Почему функции конструктора в Javascript не имеют функции в качестве прототипа? - PullRequest
0 голосов
/ 31 марта 2020

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

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

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

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

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

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

1 Ответ

0 голосов
/ 31 марта 2020

Как вы заметили, следующее 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 из-за его исторического использования для обратной совместимости).

...