...


Объектно-ориентированный JavaScript / Объекты, основанные на прототипах
Перед тем как перейти к специфике использования объектно-ориентированных возможностей JavaScript, давайте сначала выясним, в чем заключается польза объектно-ориентированного подхода. Основным здесь является то, что появляется возможность создавать более аккуратные сценарии, т.е. сценарии, в которых данные и программный код, влияющий на эти данные, инкапсулированы в одном месте. Рассмотрим объект Document. Он инкапсулирует документ, отображаемый в настоящий момент, и предоставляет интерфейс, посредством которого можно рассматривать и изменять документ частично или в целом. Можете себе представить, насколько неудобной была бы работа с документом, если бы все связанные с документом данные и методы размещались только в глобальном пространстве имен (т.е., были бы доступны не как document. нечто, а только как нечто)? Что бы произошло, если бы все функциональные возможности JavaScript были так открыты? Даже самые простые задачи программирования выливались бы в кошмар коллизий пространства имен и бесконечные поиски подходящих функций и переменных. Язык стал бы непригодным для использования. Этот пример, конечно, экстремален, но он иллюстрирует суть соответствующей проблемы. Даже абстракции меньшего масштаба зачастую лучше реализуются в виде объектов.

    Но мы не сказали, почему желательно иметь более совершенные объектно-ориентированные возможности в JavaScript, чем те, которые вы уже видели (базовые объекты Object со своими возможностями динамического добавления свойств экземпляра). Причина в том, что все, не относящееся к мелкомасштабному объектно-ориентированному программированию, становится невероятно трудоемким, если ограничиться только продемонстрированными выше подходами. Для каждого экземпляра объекта одного типа придется устанавливать одни и те же свойства и методы вручную. Эффективнее иметь способ, позволяющий один раз указать свойства и методы, которые будут общими для всех объектов определенного типа, с тем, чтобы каждый экземпляр этого типа "наследовал" общие данные и логику. Это и есть основная цель использования объектно-ориентированного подхода в JavaScript.
Объекты, основанные на прототипах
Java и С++ являются объектно-ориентированными языками программирования, основанными на классах. Свойства объекта определяет его класс - описание программного кода и данных, содержащихся в каждом объекте этого класса. В этих языках класс определяется на уровне компиляции, т.е. исходным программным кодом, создаваемым программистом. Вы не можете добавить в класс новые свойства и методы во время выполнения, и программа не может создавать новые типы данных в то время, когда она выполняется.

    Поскольку JavaScript интерпретируется (и, таким образом, не имеет видимых различий между временем компиляции и временем выполнения), здесь возможен динамический подход. В JavaScript нет формального понятия класса, но зато имеется возможность создавать новые типы объектов "на лету" и изменять свойства существующих объектов в любое время.
    JavaScript является объектно-ориентированным языком, основанным на прототипах. Это значит, что каждый объект имеет прототип - объект, от которого данный объект наследует свойства и методы. Когда осуществляется доступ к свойству объекта или вызывается его метод, интерпретатор сначала проверяет, имеет ли объект свойство экземпляра с тем же именем. Если имеет, то используется свойство экземпляра. Если же - нет, интерпретатор проверяет прототип объекта на наличие соответствующего свойства. При таком подходе свойства и методы, общие для всех объектов данного типа, могут инкапсулироваться в прототип, а каждый объект может иметь свойства экземпляра, представляющие специфические данные этого объекта. Например, прототип Date должен содержать метод, превращающий объект в строку, поскольку способ выполнения этой задачи будет одинаковым для всех объектов Date. Но каждый индивидуальный объект Date должен иметь собственные данные, сообщающие конкретные дату и время, представленные этим объектом.
    Последним концептуальным аспектом на пути понимания работы объектов в JavaScript является рекурсивность отношения прототипа. Это значит, что прототип объекта -тоже объект, который может иметь прототип, и т.д. То есть, если свойство, к которому осуществляется доступ, не найдено среди свойств экземпляра объекта и не найдено среди свойств прототипа, интерпретатор "следует" по цепочке прототицов к прототипу прототипа и ищет свойство там. Если свойство и там не найдено, поиск будет продолжаться по цепочке прототипов "выше". Вы можете спросить: а где же конец? Ответ прост: в базовом объекте Object. Все объекты JavaScript в конечном счете "десантированы" из базового объекта Object, так что поиск останавливается именно там. Если свойство не найдено в объекте Object, значением свойства становится undefined (а в случае вызова метода генерируется ошибка выполнения).
назад: далее: Конструкторы



( )


10

?

:










@ 2008-2011 Amber

.