@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); //какое-нибудь свойство


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

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

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

Войти через центр авторизации
Похожие вопросы