Прототип в JavaScript:-

Прототипы — это механизм, использующий этот объект JavaScript, который наследует функцию от других объектов, ИЛИ мы можем сказать, что когда мы создаем объект в JavaScript, механизм JavaScript автоматически прикрепляет некоторое свойство к объектам.

Механизм JavaScript прикрепляет некоторое свойство к переменной, массиву, объектам, мы можем получить доступ к этому свойству с помощью оператора точки. Из этого механизма мы узнали, что все в JavaScript является объектами.

const Person = {
name: "John",
greet() {
  console.log('My name is' + this.name)
};

Person.greet() // My name is John.

В приведенном выше примере кода мы определили только два свойства: имя объекта Person и другое свойство — приветствие, но движок JavaScript внутренне прикрепляет приведенное ниже свойство к объектам человека.

__defineGetter__
__defineSetter__
__lookupGetter__
__lookupSetter__
__proto__
name
constructor
greet
hasOwnProperty
isPrototypeOf
propertyIsEnumerable
toLocaleString
toString
valueOf

Когда мы пытаемся получить доступ к одному из них: -

Person.toString(); // "[object Object]"

Это работает (даже если непонятно, что делает toString()).

Что это за дополнительные свойства и откуда они берутся?

Каждый объект в JavaScript имеет встроенное свойство, которое называется его прототипом. Прототип сам по себе является объектом, поэтому прототип будет иметь свой собственный прототип, создавая так называемую цепочку прототипов. Цепочка заканчивается, когда мы достигаем прототипа, у которого есть null для собственного прототипа.

Если мы хотим узнать о прототипе вашего объекта, вы можете использовать это: -

Object.getPrototypeOf(myObject); // Object { }

Это объект с именем Object.prototype, и это самый простой прототип, который есть у всех объектов по умолчанию. Прототипом Object.prototype является null, поэтому он находится в конце цепочки прототипов:

Прототип объекта не всегда Object.prototype.

const myDate = new Date();
let object = myDate;

do {
  object = Object.getPrototypeOf(object);
  console.log(object);
} while (object);

// Date.prototype
// Object { }
// null

Этот код создает объект Date, затем проходит по цепочке прототипов, регистрируя прототипы. Это показывает нам, что прототипом myDate является объект Date.prototype, а прототипом это является Object.prototype.

На самом деле, когда вы вызываете знакомые методы, такие как myDate2.getMonth(), вы вызываете метод, определенный в Date.prototype.