@The_good_game

Правильно ли я понимаю работу прототипов?

Я уже который день пытаюсь с этим разобраться, поэтому не могли бы вы подсказать, правильно ли я уловил суть?

Когда мы создаём объект через функцию-конструктор, в самой функции, хотя мы его и не указывали, присутствует скрытое свойство prototype. В самом начале оно является простым объектом с сылкой на функцию-конструктор.

function User(name, surname) {
  name = name,
  surname = surname
}
console.log(User.prototype);  // {constructor: User {}}


Если мы хотим, чтобы новые экземпляры объекта унаследовали свойства из функции конструктора, у нас есть два варианта: мы можем добавить необходимые свойства прямиком в тело функции, либо в объект prototype. Но между этими двумя способами, конечно, есть различия.

Когда мы добавляем свойства прямиком в тело функции, они дублируются каждый раз при создании нового объекта.

Если же мы добавляем свойства в объект F.prototype, то оно создаётся один раз и находится только в этом объекте. Однако новый экземпляр объекта будет иметь доступ ко всем его ключам, но не к самому F.prototype.

function User(name, surname) {
  this.name = name,
  this.surname = surname
}

User.prototype.sayHello = function () {
  return `Всем привет! Я функция, и я живу в объекте User.prototype`;
}

let user1 = new User('Vasya', 'Big');

console.log(user1)  // User { name: 'Vasya', surname: 'Big' }

console.log(user1.sayHello()); // всё работает


И ещё один момент. Только вчера до меня дошло, что каждый раз, когда мы создаём какой-либо объект, даже используя литеральную нотацию, мы всё равно используем функцию-конструктор (Object).

/*
function Object(value1, value2) {
  this.prop1 = value1,
  this.prop2 = value2
}

let anyObject = new Object(value1, value2);
*/

let anyObject = {
  prop1: value1,
  prop2: value2
}


Раньше я думал, что Object - это корневой объект, но на самом деле это функция-конструктор, у которого также есть свойство "prototype". И именно от объекта Object.prototype наследуются все встроенные методы новых объектов.

console.log(typeof Object);                // function
console.log(typeof Object.prototype);      // object
 
Object.prototype.someString = 'какое-нибудь свойство';

let obj = {
  name: 'Vasya',
  surname: 'Big'
}

console.log(obj.someString); //какое-нибудь свойство


Если я где-то ошибаюсь или вам есть, что дополнить — буду очень рад прочитать ваши ответы.
  • Вопрос задан
  • 115 просмотров
Решения вопроса 1
lazalu68
@lazalu68
Salmon
Да, всё верно

Видимо прошлый ответ удалили из-за того что он слишком короткий. В тексте вопроса я вообще ни к чему не могу придраться, разве что к словам Вам и Ваши написанным с большой буквы, ибо это лизоблюдство не имеющее связи с русским языком над которым смеялся еще Розенталь, но тк это к теме не относится, то кроме "да" я больше ничего не могу ответить
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
Artezio Нижний Новгород
от 130 000 до 180 000 ₽
Artezio Москва
от 160 000 до 220 000 ₽
Intspirit Краснодар
от 80 000 до 150 000 ₽
24 янв. 2021, в 01:39
12000 руб./за проект
24 янв. 2021, в 01:30
1000000 руб./за проект
24 янв. 2021, в 00:56
40000 руб./за проект