Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

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

Денис Александрович Ученик (41), закрыт 3 года назад
Зачем нужен prototype в JavaScript?

При создании любого объекта в JavaScript создается новый объект __proto__ в системе который ссылается на функцию (класс) с помощью которого этот объект создан.
При объявлении функции или класса создается также объект с именем prototype.
Он создается для того чтобы потомки функции-классы могли унаследовать его свойства или для того чтобы сделать чисто инициализацию конструктора, который создается когда объявляется любая функция или класс?
Лучший ответ
del Мудрец (19049) 3 года назад
>> Зачем нужен prototype в JavaScript?
Так в JavaScript реализуют наследование. поищи в интернете определение слова "прототип"

>> При создании любого объекта в JavaScript создается новый объект __proto__ ...
Это выдуманная чушь никаких дополнительных объектов не создается.

>> При объявлении функции или класса создается также объект prototype ...
Такая же чушь.

__proto__ это ссылка на уже созданный ранее отдельный объект.
к примеру Object это один отдельный объект и все его потомки просто на него ссылаются. Соответственно изменив этот объект ты сразу же изменяешь всех его потомков

Это основное отличие прототипного наследования от конструирования экземпряров класса в языках навроде С++ где при инстанцировании экземпляра класса вызываются все конструкторы по цепочке наследования и создается отдельный класс со всеми свойствами и методами.
В JavaScript создается только текущий объект и добавляется ссылка на его прототип а свойства и методы ищутся по цепочке прототипов т. е. если метод не найден у текущего объекта то он ищется у прототипа если он снова не найден то он ищется у прототипа прототипа и так далее.

В компилируемых языках методы и свойства конструируются полностью и сразу конструктором.
В JavaScript используются разветвленная древовидная структура живых прототипов
их в любой момент можно изменять и это сразу же отразится на потомках что позволяет на полную катушку использовать метопрограммирование.
Денис АлександровичУченик (41) 3 года назад
При объявлении функции, у нее автоматически создается свойство prototype, свойство prototype должно быть у какого-то объекта, правильно? Какого объекта?

Зачем создается свойство prototype в движке Javascript? Какая основная цель создания свойства prototype? Для того чтобы инициализировать конструктор когда создам объект?
del Мудрец (19049) Денис Александрович, Набери в консоли отладчика « console.dir(alert.__proto__) » ну или заменить alert на имя понравившейся функции.
Денис АлександровичУченик (41) 3 года назад
prototype также придуман чтобы инициализировать конструктор перед созданием объекта?
del Мудрец (19049) Денис Александрович, это просто ссылка. Никаких конструкторов при присвоение ссылке значения не вызывается. Конструктор вызывается только при создании объекта после того как он создан можно использовать ссылку на него сколько угодно раз.
Денис АлександровичУченик (41) 3 года назад
После того как я через new создам объект произойдет инициализация конструктора, но само создание конструктора происходит после объявлении функции или класса?
del Мудрец (19049) Денис Александрович, Изначально в JS не было отдельного понятия как конструктор любая функция могла выступать в роли конструктора для создания нового объекта и вызов функции с new и без отличался только "контекстом исполнения". Без new функция вызывается в текущем контексте. Вызов с new создает новый объект в контексте которого вызывается функция. т. е. изменяется или нет область видимости и лексическое окружение для функции что в целом и является контекстом исполнения. Много умноватых слов но в целом идея довольно простая. Вообще все созданные объекты (и обычные переменные) доступны через древовидную структуру и связаны между собой ссылками двух видов это __proto__ и [[scope]]. Функция с new создает новый узел в этой структуре а просто функция использует ранее созданные узлы.
Денис АлександровичУченик (41) 3 года назад
Ссылка - это __proto__ а prototype - это ведь не ссылка
del Мудрец (19049) Денис Александрович, >> Ссылка - это __proto__ а prototype - это ведь не ссылка Так исторически сложилось что свойство __proto__ было скрытым и не доступным программистам а для реализации наследования в скриптах использовали свойство prototype которое в случае вызова функции как конструктора становилось в __proto__. т. е. если совсем буквально то __proto__ и prototype самые обычные свойства которым можно присваивать значения и читать значения.
Денис АлександровичУченик (41) 3 года назад
Это скрытые свойства самого движка Javascript или скрытые свойства объекта Object? Ведь свойства __proto__ и prototype имеет какой-то объект. Какой объект имеет эти свойства?
del Мудрец (19049) Денис Александрович, свойство __proto__ имеет абсолютно любой объект и объектный тип. Свойство prototype можно создать и использовать в функции которая вызывается как конструктор. Далеко не обязательно для создания объекта использовать конструктор. К скрытым свойствам из кода обратится невозможно. Если ты видишь и обращаешься к свойствам значит они не скрыты. Обычно в литературе скрытые свойства описывают в двойных квадратных скобках например [[Prototype]] но это уже сложная тема совсем не нужная новичкам. Свойства объекта это просто свойства объекта такие же как и все другие не стоит им приписывать всякие мистические принадлежности.
Остальные ответы
Похожие вопросы