Интернет, компьютеры, софт и прочий Hi-Tech

Подписаться через RSS2Email.ru

ООП в JavaScript

Введение

Здесь обсуждается техника, которую я использую уже несколько лет для имитации Объектно-ориентированного программирования в стиле таких языков, как C# и Java. Ключевое слово здесь - "имитация". Это вовсе не полноценный эквивалент того, к чему вы привыкли в указанных языках. JavaScript - очень выразительный язык и потому позволяет множество различных техник для создания повторно используемого и расширяемого кода. То, что я описываю здесь, отнюдь не является ответом на все вопросы по этой теме.

В этой статье будет использоваться терминология ООП в стиле Java и C#, хотя это технически неправильно при обсуждении JavaScript. В общем, если вы находите применение такой терминологии к JS неприемлемым, то закройте эту страницу немедленно! Всем остальным следует иметь в виду, что я всего лишь пытаюсь использовать удобные идиомы. Я стремлюсь создавать библиотеки в специфическом для JS стиле кодирования, хорошо удовлетворяющем мои нужды. Возможно кто-то возразит, что писать на JS таким способом неэффективно. Если вы решите использовать этот подход или даже собственную обертку ООП для JS, то должны быть готовы к спорам типа "табуляция против пробелов". Но хватит разглагольствований, давайте перейдем к делу!

ЗАМЕЧАНИЕ: Этот учебник был изменен. Если вы хотите увидеть оригинальный "Учебник по наследованию", то можете найти его здесь со всеми его недостатками.

Базовый класс

Первое, что нам нужно, - это базовый "класс", экземпляры которого можно создавать с помощью оператора "new". Идентификатор, следующий за оператором "new" является конструктором объекта и любая функция JavaScript может быть использована в этом качестве. В частности, следующий код создает функцию Person, а затем инстанцирует новый объект Person (человек).

function Person(first, last) {
    this.first = first;
    this.last = last;
}

var person = new Person("John", "Dough");

Оператор "new" будет вызывать ваш конструктор с указанными параметрами. Специальная переменная с названием "this" всегда существует внутри области определения конструктора. Это - указатель на текущий экземпляр объекта (иногда называемый активируемым объектом), с которым вы будете работать. Используя "this" вы можете создавать и изменять в конструкторе свойства объекта. Таким образом, мы имеем базовый "класс" Person.

Добавляем метод

Теперь для манипулирования экземплярами класса мы хотим добавить в него соответствующие методы. Создадим, для примера, часто полезный метод "toString", который поможет вам просматривать содержимое вашего объекта с помощью команды "alert". Следующий код добавляет этот метод в нашу реализацию базового класса:

Person.prototype.toString = function() {
    return this.first + " " + this.last;
}

alert( person ); // покажет "John Dough"

Здесь продемонстрирована одна из уникальных особенностей языка JavaScript, какой является концепция прототипов. Короче говоря, все объекты JS имеют скрытое свойство "prototype" (прототип). Я называю его "скрытым" ("private") потому что это свойство недоступно для просмотра и изменения непосредственно. Во время исполнения, если происходит обращение к какому-то свойству объекта, то сначала проверяется, не определено ли оно в нем непосредственно. Если это не так, то требуемое свойство ищется в прототипе. Прототипы могут иметь собственные скрытые прототипы и, таким образом, поиск может осуществляться дальше по цепочке прототипов. Это будет продолжаться до тех пор, пока свойство не будет найдено, или пока очередной прототип не окажется null. В последнем случае будет считаться, что свойство не определенно.

Как указывалось ранее, когда мы вызываем "new", создается новый объект, экземпляр которого становится доступным в конструкторе. Вместе с тем, происходит присвоение прототипа конструктора (общедоступного (public) свойства prototype) скрытому прототипу нового экземпляра. Определяя свойства прототипа конструктора, такие как вышеуказанный Person.prototype.toString, мы создаем свойства, которые будут существовать в приватных прототипах каждого из новых экземпляров. В результате они становятся методами экземпляра.

Читайте далее:


Кевин Линдсей (Kevin Lindsey), 2006

Перевод Д. Скоробогатова (20.10.2009). Оригинальный текст: http://www.kevlindev.com/tutorials/javascript/inheritance/index.htm.

Биржа долевых инвестиций SIMEX.

Последнее редактирование: 2009-10-20 15:40:33

Метки материала: JavaScript, ООП, программирование, языки программирования, явная инициализация

Оставьте, пожалуйста, свой комментарий к публикации

Представиться как     Антибот:
   

Просьба не постить мусор. Если вы хотите потестить xBB, воспользуйтесь кнопкой предварительного просмотра на панели инструментов xBBEditor-а.


© 2007-2017, Дмитрий Скоробогатов.
Разрешается воспроизводить, распространять и/или изменять материалы сайта
в соответствии с условиями GNU Free Documentation License,
версии 1.2 или любой более поздней версии, опубликованной FSF,
если только иное не указано в самих материалах.