Почему в объекте __proto__, который содержит функция-конструктор.prototype, нужно указывать prototype после точки?
Такой вопрос. Почему если какой-либо объект был создан с помощью функции-конструктора, то в __proto__ он обязательно будет содержать функция-конструктор.prototype?
function NewObj() {};
let a = new NewObj;
console.log(a.__proto__ == NewObj.prototype); //true
Какой практический смысл в указании prototype после точки? Спрашиваю это, потому что вроде бы как... prototype функции-конструктора содержит единственное св-во constructor, которое в свою очередь содержит ссылку на эту же функцию-конструктор. Так вот, в чем смысл фактически 2 раза подряд ссылаться на одну и ту же функцию-конструктор?
Почему, например, такая запись выдает false?
function NewObj() {};
let a = new NewObj;
console.log(a.__proto__ == NewObj);
Ответы (1 шт):
NewObj.prototype обычно используется как хранилище данных или методов, общих для всех экземпляров, созданных конструктором. Этот NewObj.prototype автоматически назначается прототипом создаваемых экземпляров, в котором по цепочке прототипов ищутся свойства, отсутствующие непосредственно в экземплярах. То есть, хоть по умолчанию там есть только свойство .constructor, туда можно добавить что угодно. Обычно это работает так:
function NewObj() {};
NewObj.prototype.foo = 42;
let a = new NewObj;
let b = new NewObj;
console.log(a.foo); // 42
console.log(b.foo); // 42
Подробности см., например, в этих разделах: https://learn.javascript.ru/prototypes