Что такое prototype в javascript?

Вопрос, наверное, изъезженный и не смотря на количество заумных описаний, доступных в интернете, я все равно не понимаю, что это такое. Потому прошу объяснить на конкретном примере:

jsfiddle.net/Winner/LjG8n

Задача следующая: прописать событие на заполнение формы внутри моего класса таким образом, чтобы внутри события я мог вызвать метод уже объекта этого класса, то есть метод не должен быть статическим. Сейчас при нажатии на submit я имею undefined при попытке вывести атрибут x.

jsfiddle.net/Winner/LjG8n/2

В этом же примере в качестве значения X выводится уже что-то более приличное, но одинаковое для двух объектов.

Собственно почему так и как мне быть в моей ситуации?
  • Вопрос задан
  • 6181 просмотр
Решения вопроса 1
jsfiddle.net/ck89g/1

Прототип (Конструктор.prototype) - объект, который клонируется по ссылке при создании инстанса конструктора через new. Создается объект со скрытым свойством [[prototype]], в некоторых движках свойство доступно как Инстанс.__proto__. При получении свойств инстанса, если они отсутствуют в новом объекте, движок ищет их в прототипе. Новые же свойства пишутся в инстанс, не изменяя прототип.
В примере у вас еще и проблемы с пониманием контекста вызова (this) функции. В конструкторе (при вызове через new) это будет новый, созданный из прототипа, объект. В методе это объект, от которого его вызывают (до последней точки). При вызове как функции (без точек) это глобальный объект (window). Контекст можно привязать методом функции .bind или запустить функцию в произвольном контексте - .call, .apply.
Вы добавляете метод и свойство в прототип при каждом вызове конструктора и запускаете метод в контексте прототипа, а не инстанса.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@lega
Что такое prototype в javascript?

По простому, это возможность использовать объект (ф-ию/переменную) "родителя" (прототипа) если нет своего объекта.
Например вы пытаетесь вызвать ф-ию form1.echoX(), т.к. её нет будет попытка вызвать form1.__proto__.echoX(), если этой нет то form1.__proto__.__proto__.echoX() и т.д.
Как "заполнять" прототип, можете найти в "любом" учебнике по JS, так же @rock привел пример.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Похожие вопросы