Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   __proto__ и prototype в JavaScript (https://javascript.ru/forum/misc/81655-__proto__-i-prototype-v-javascript.html)

denis_alekss 06.01.2021 14:12

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

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

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

MallSerg 06.01.2021 15:11

https://otvet.mail.ru/question/223341802 =)

denis_alekss 06.01.2021 15:24

Цитата:

Сообщение от MallSerg (Сообщение 532379)

Это мой вопрос на mail.ru А кто-то может дать свой ответ?

Смотрел видео Димыча который ведет уроки в Беларусии по JavaScript, он говорит что при создании функции или класса создается объект prototype, а при создании объекта создается ссылка на этот prototype. А этот человек на маил.ру ответил что ничего не создается. Этот один вопрос.
И второй... Цель создания свойства prototype для функции?
Чтобы инициализировать конструктортой функции которой я придумал после того как я создам объект своего же класса(функции)?

Alexandroppolus 06.01.2021 15:37

https://learn.javascript.ru/prototype-inheritance

denis_alekss 06.01.2021 15:43

Цитата:

Сообщение от Alexandroppolus (Сообщение 532382)

Я прочитал эту статью но там не указан ответ на мой вопрос, там написано как оформлять код, но не написано что происходит при объявлении функции и что происходит при объявлении объекта с __proto__ и prototype и где происходит и зачем конкретно прототайп нужен, статья не отвечает на вопросы на которые я описал выше.

Alexandroppolus 06.01.2021 15:55

Да, про функцию там нет. В след. статье есть
https://learn.javascript.ru/function-prototype

MallSerg 06.01.2021 20:14

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

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

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

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

console.dir(f);

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

Ну и как пример хорошего материала с ютуба правда устарело на кучу лет
https://www.youtube.com/watch?v=a3X9uqCoxKY

denis_alekss 07.01.2021 14:26

Цитата:

Сообщение от MallSerg (Сообщение 532390)
>>
И изучи из чего состоит полученный объект.

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

console.dir(f);

Этот объект состоит из:

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


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

voraa 07.01.2021 19:03

Цитата:

Сообщение от 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.

voraa 07.01.2021 19:28

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

Любой объект содержит свойство __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)


Часовой пояс GMT +3, время: 15:53.