Я пытаюсь разобраться в прототипах и хотел бы знать, что такое прототип. Большая часть путаницы связана с непониманием метаязыка, используемого для описания прототипов.
Вот что я знаю:
Когда мы создаем именованную функцию-конструктор со свойствами внутри нее, свойства внутри тела этой функции-конструктора наследуются экземплярами объекта, созданными этой функцией-конструктором. Здесь я создал экземпляр с именем person001 из функции-конструктора с именем Person.
function Person(firstName,lastName) {
this.firstName = firstName;
this.lastName = lastName
}
undefined
var person001 = new Person("John","Doe");
Когда я смотрю на экземпляр объекта в консоли и отслеживаю цепочку прототипов, я нахожу его в двух разных местах. Это объект-конструктор прото-объекта dunder...
Person {firstName: "John", lastName: "Doe"}
firstName: "John"
lastName: "Doe"
__proto__:
constructor: ƒ Person(firstName,lastName)
__proto__: Object
и свойство объекта-прототипа внутри того же объекта-конструктора.
Person {firstName: "John", lastName: "Doe"}
firstName: "John"
lastName: "Doe"
__proto__:
constructor: ƒ Person(firstName,lastName)
arguments: null
caller: null
length: 2
name: "Person"
prototype:
constructor: ƒ Person(firstName,lastName)
__proto__: Object
__proto__: ƒ ()
[[FunctionLocation]]: script.js:76
[[Scopes]]: Scopes[1]
__proto__: Object
Когда я добавляю свойство, используя свойство .prototype именованной функции-конструктора, я добавляю это свойство к объекту-прототипу, а НЕ к функции-конструктору. Добавленное свойство будет находиться рядом с функцией-конструктором в объекте свойства-прототипа. Здесь я добавляю свойство с именем age, используя свойство прототипа функции-конструктора Person.
Person.prototype.age = 0;
Итак, теперь, когда я добавил дополнительное свойство, что же такое прототип?
Когда я запускаю метод Object.getPrototypeOf для экземпляра объекта person001, он возвращает то, что мне кажется прототипом объекта. У него есть 3 свойства — функция-конструктор, свойство, которое я добавил, и неявный прото-объект dunder.
Object.getPrototypeOf(person001);
{age: 0, constructor: ƒ}
age: 0
constructor: ƒ Person(firstName,lastName)
__proto__: Object
Так что же такое прототип? Это объект-прототип {функция-конструктор, дополнительные свойства}? Или это просто функция-конструктор объекта-прототипа?
Заранее спасибо за вашу помощь.