Функции в javascript. Урок 4. Прототипы

Оглавление цикла уроков по функциям в javascript.

Как я уже оговорился в предыдущем уроке, вновь создаваемый объект не совсем пустой, у него есть, например, поле __proto__ (доступное явно не во всех браузерах), которое содержит ссылку на прототип этого объекта. Прототип — это тоже некий объект, который приходит на помощь, когда у нашего объекта нет полей и методов, нужных нашей программе. По сути, через прототипы в javascript реализуется механизм наследования. Как же задать прототип? Очень просто — через свойство prototype функции-конструктора:


Как видим, метод test(), определенный для прототипа, доступен во всех объектах, созданных этим конструктором. Более того, мы можем на лету менять содержимое прототипа (добавлять, удалять, менять поля и методы), и это сразу отражается на созданных объектах:

Можно даже так: через первый объект получаем доступ к прототипу, добавляем, а вызываем метод у второго объекта. Взгляните:

Нужно учитывать, что обращение к полю в прототипе происходит только тогда, когда у самого объекта нет поля с таким именем, например:

Как же нам узнать, является ли поле собственным для объекта или заимствуется у прототипа? Для этого у каждого объекта есть метод hasOwnProperty(), принимающий в качестве параметра строку с именем поля и возвращающий true или false, продемонстрируем на примере, как должен выглядеть перебор объекта методом for-in, учитывая возможность наличия полей в прототипе:

Как видим, попытка эмулировать ассоциативные массивы на javascript может закончиться не тем, что мы ожидали, если не учитывать «прототипную» природу этого языка. Этот пример также показывает, что мы легко можем добавлять новые поля и методы и во встроенные «типы» тоже.

То, что у всех объектов, создаваемых одним конструктором, единый объект-прототип, можно увидеть на следующем примере (учитывайте, что массив — это не примитивный тип, а тоже объект, поэтому поля разных объектов ссылаются на один и тот же массив):

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

Как видим, немного сложный, но все же в javascript есть механизм наследования. С этим механизмом тесно связан оператор instanceof, возвращающий true, если проверяемый объект принадлежит заданному «типу», то есть, создан ли он, его прототип, прототип прототипа и т.д. данным конструктором:

Напоследок стоит упомянуть, что мы можем применять прототипные методы встроенных типов, например, метод join(), присущий массивам, к «недомассиву» arguments:

А еще мы можем «допилить» встроенные типы, добавив к ним новые методы:

На этом, пожалуй, хватит, остальное придет с опытом. :)

Оглавление цикла уроков по функциям в javascript.

Добавить комментарий