__proto__ и prototype в JavaScript
Зачем нужен prototype в JavaScript?
При создании любого объекта в JavaScript создается новый объект __proto__ в системе который ссылается на функцию(класс) с помощью которого этот объект создан. При объявлении функции или класса создается также объект с именем prototype. Он создается для того чтобы потомки функции-классы могли унаследовать его свойства или для того чтобы сделать чисто инициализацию конструктора, которая происходит после new когда объявляется любая функция или класс? |
|
Цитата:
Смотрел видео Димыча который ведет уроки в Беларусии по JavaScript, он говорит что при создании функции или класса создается объект prototype, а при создании объекта создается ссылка на этот prototype. А этот человек на маил.ру ответил что ничего не создается. Этот один вопрос. И второй... Цель создания свойства prototype для функции? Чтобы инициализировать конструктортой функции которой я придумал после того как я создам объект своего же класса(функции)? |
|
Цитата:
|
Да, про функцию там нет. В след. статье есть
https://learn.javascript.ru/function-prototype |
>> А этот человек на маил.ру ответил ...
Это был я ![]() >> который ведет уроки по JavaScript ... На мой скромный взгляд пару часов воды разбавленных вкраплениями чуши и бреда. Главное в изучении JavaScript научится пользоваться отладчиком что бы проверять и закреплять полученные знания на опыте. выполни в консоли браузера ff = function fun (){}; f = new ff(); console.dir(f); И изучи из чего состоит полученный объект. Ну и как пример хорошего материала с ютуба правда устарело на кучу лет https://www.youtube.com/watch?v=a3X9uqCoxKY |
Цитата:
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 Цитата:
|
Тут же нет ничего сложного
Любой объект содержит свойство __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. |