Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 06.01.2021, 14:12
Аспирант
Отправить личное сообщение для denis_alekss Посмотреть профиль Найти все сообщения от denis_alekss
 
Регистрация: 01.12.2020
Сообщений: 55

__proto__ и prototype в JavaScript
Зачем нужен prototype в JavaScript?

При создании любого объекта в JavaScript создается новый объект __proto__ в системе который ссылается на функцию(класс) с помощью которого этот объект создан.

При объявлении функции или класса создается также объект с именем prototype.
Он создается для того чтобы потомки функции-классы могли унаследовать его свойства или для того чтобы сделать чисто инициализацию конструктора, которая происходит после new когда объявляется любая функция или класс?

Последний раз редактировалось denis_alekss, 06.01.2021 в 14:14.
Ответить с цитированием
  #2 (permalink)  
Старый 06.01.2021, 15:11
Аватар для MallSerg
Профессор
Отправить личное сообщение для MallSerg Посмотреть профиль Найти все сообщения от MallSerg
 
Регистрация: 07.03.2011
Сообщений: 1,138

https://otvet.mail.ru/question/223341802 =)
Ответить с цитированием
  #3 (permalink)  
Старый 06.01.2021, 15:24
Аспирант
Отправить личное сообщение для denis_alekss Посмотреть профиль Найти все сообщения от denis_alekss
 
Регистрация: 01.12.2020
Сообщений: 55

Сообщение от MallSerg Посмотреть сообщение
https://otvet.mail.ru/question/223341802 =)
Это мой вопрос на mail.ru А кто-то может дать свой ответ?

Смотрел видео Димыча который ведет уроки в Беларусии по JavaScript, он говорит что при создании функции или класса создается объект prototype, а при создании объекта создается ссылка на этот prototype. А этот человек на маил.ру ответил что ничего не создается. Этот один вопрос.
И второй... Цель создания свойства prototype для функции?
Чтобы инициализировать конструктортой функции которой я придумал после того как я создам объект своего же класса(функции)?
Ответить с цитированием
  #4 (permalink)  
Старый 06.01.2021, 15:37
Аватар для Alexandroppolus
Профессор
Отправить личное сообщение для Alexandroppolus Посмотреть профиль Найти все сообщения от Alexandroppolus
 
Регистрация: 25.10.2016
Сообщений: 1,012

https://learn.javascript.ru/prototype-inheritance
Ответить с цитированием
  #5 (permalink)  
Старый 06.01.2021, 15:43
Аспирант
Отправить личное сообщение для denis_alekss Посмотреть профиль Найти все сообщения от denis_alekss
 
Регистрация: 01.12.2020
Сообщений: 55

Сообщение от Alexandroppolus Посмотреть сообщение
https://learn.javascript.ru/prototype-inheritance
Я прочитал эту статью но там не указан ответ на мой вопрос, там написано как оформлять код, но не написано что происходит при объявлении функции и что происходит при объявлении объекта с __proto__ и prototype и где происходит и зачем конкретно прототайп нужен, статья не отвечает на вопросы на которые я описал выше.

Последний раз редактировалось denis_alekss, 06.01.2021 в 15:47.
Ответить с цитированием
  #6 (permalink)  
Старый 06.01.2021, 15:55
Аватар для Alexandroppolus
Профессор
Отправить личное сообщение для Alexandroppolus Посмотреть профиль Найти все сообщения от Alexandroppolus
 
Регистрация: 25.10.2016
Сообщений: 1,012

Да, про функцию там нет. В след. статье есть
https://learn.javascript.ru/function-prototype
Ответить с цитированием
  #7 (permalink)  
Старый 06.01.2021, 20:14
Аватар для MallSerg
Профессор
Отправить личное сообщение для MallSerg Посмотреть профиль Найти все сообщения от MallSerg
 
Регистрация: 07.03.2011
Сообщений: 1,138

>> А этот человек на маил.ру ответил ...
Это был я

>> который ведет уроки по JavaScript ...
На мой скромный взгляд пару часов воды разбавленных вкраплениями чуши и бреда.

Главное в изучении JavaScript научится пользоваться отладчиком что бы проверять и закреплять полученные знания на опыте.

выполни в консоли браузера
ff = function fun (){};
f = new ff();

console.dir(f);

И изучи из чего состоит полученный объект.

Ну и как пример хорошего материала с ютуба правда устарело на кучу лет
https://www.youtube.com/watch?v=a3X9uqCoxKY
Ответить с цитированием
  #8 (permalink)  
Старый 07.01.2021, 14:26
Аспирант
Отправить личное сообщение для denis_alekss Посмотреть профиль Найти все сообщения от denis_alekss
 
Регистрация: 01.12.2020
Сообщений: 55

Сообщение от MallSerg Посмотреть сообщение
>>
И изучи из чего состоит полученный объект.

ff = function fun (){};
f = new ff();

console.dir(f);
Этот объект состоит из:

1. функции fun
2. конструктора fun
3. __proto__ ссылается на функцию-класс с помощью которого он был создан, то есть на функцию fun.
4. Сама функция fun ссылается на Object.prototype


Конструктор как выглядит здесь? Он создается для потомков?

Последний раз редактировалось denis_alekss, 07.01.2021 в 14:31.
Ответить с цитированием
  #9 (permalink)  
Старый 07.01.2021, 19:03
Аватар для voraa
Профессор
Отправить личное сообщение для voraa Посмотреть профиль Найти все сообщения от voraa
 
Регистрация: 03.02.2020
Сообщений: 2,743

Сообщение от denis_alekss
1. функции fun
2. конструктора fun
3. __proto__ ссылается на функцию-класс с помощью которого он был создан, то есть на функцию fun.
4. Сама функция fun ссылается на Object.prototype
Не так
Объект f не состоит из функции fun. То, что в отладчике написано fun при выводе объекта означает, что это объект "типа fun", т.е порожден с помощью new fun.
f - пустой объект. У него нет свойств, кроме __proto__.
__proto__ ссылается на объект который содержит свойства constructor и __proto__. Это тот же самый объект на который ссылается fun.prototype.
constructor - это ссылка на саму функцию fun
Сообщение от denis_alekss
Конструктор как выглядит здесь? Он создается для потомков?
конструктор - это сама функция fun.
Ответить с цитированием
  #10 (permalink)  
Старый 07.01.2021, 19:28
Аватар для voraa
Профессор
Отправить личное сообщение для voraa Посмотреть профиль Найти все сообщения от voraa
 
Регистрация: 03.02.2020
Сообщений: 2,743

Тут же нет ничего сложного

Любой объект содержит свойство __proto__, значением которого является ссылка на другой объект, который называется прототипом или null.

Любая функция - это тоже объект, который может содержать различные свойства. При создании (определении) функции у нее обязательно создается свойство prototype, значением которого является объект, содержащий свойство constructor, которое является ссылкой на саму функцию. Этот prototype мы потом можем дополнять (или вообще изменить).

Итак.
Когда мы написали
function fun () {}

создался
fun.prototype = {
    constructor : fun
}

Теперь мы можем, например, что то добавлять в fun.prototype
fun.prototype.f1 = function () {...};
fun.prototype.f2 = function () {...};

Когда мы создаем новый объект с помощью new
let o = new fun()

происходит следующее:
Создается пустой объект
в его свойство __proto__ записывается fun.prototype
let o={};
o.__proto__ = fun.prototype;

Далее вызывается функция fun и этот объект передается ей в качестве this. Как при вызове
fun.apply(o)
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
иерархия объектов javascript и prototype skrudjmakdak Events/DOM/Window 6 05.07.2013 19:57
Книга: JavaScript. Сильные стороны Magneto Учебные материалы 16 21.04.2013 15:28
Интерпретатор Java на JS kobezzza Оффтопик 24 11.10.2012 18:32
Последние книги по JavaScript! monolithed Учебные материалы 7 26.10.2010 19:40
Выдвет ошибку JavaScript Ромио Opera, Safari и др. 4 21.10.2010 20:34