Наследование в JavaScript

Программисты, использующие JavaScript, имитируют классы с помощью объектов Function – иногда неправильно используя возможности языка, иногда эффективно решая определенные проблемы. По своей природе объект Function в языке JavaScript представляет собой тот самый механизм, который обеспечивает основу имитации классов. А именно, он играет роль функции!конструктора, которая используется совместно с оператором new для создания экземпляров объектов, и роль шаблона, на основе которого создаются эти объекты.

Для иллюстрации в примере 10.1 вашему вниманию предлагается короткий фрагмент программного кода, который имитирует простой класс Shape на языке JavaScript. Обратите внимание: в соответствии с общепринятыми соглашениями имена классов начинаются с заглавных символов.

Пример 10.1. Типичный класс на JavaScript
// Определение класса
function Shape(centerX, centerY, color)
{
this.centerX = centerX;
this.centerY = centerY;
this.color = color;
};
// Создание экземпляра
s = new Shape(10, 20, "blue");

Как только интерпретатор JavaScript выполнит определение функции, объект Shape появится в памяти и сможет играть роль объекта прототипа для создания экземпляров с помощью функцииконструктора и оператора new.

Для полноты картины следует заметить, что объявление объекта Shape можно было бы выполнить более компактно, воспользовавшись функцией extend из библиотеки Base:
// Создать объект типа Function
function Shape() {}
// Расширить этот прототип некоторыми значениями по умолчанию
dojo.extend(Shape, {
centerX : 0,
centerY : 0,
color : ""
});

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


Для этого можно было бы воспроизвести совершенно новый класс, например класс окружностей, но более практичный подход заключается в наследовании класса окружности от класса фигуры, который уже определен, потому что любая окружность является частным случаем фигуры. К тому же у вас уже имеется класс фигуры Shape, так почему бы не использовать его?

Пример 10.2 демонстрирует один из способов, обеспечивающих такое наследование в JavaScript.
Пример 10.2. Типичное наследование в JavaScript
// Определение подкласса
function Circle(centerX, centerY, color, radius)
{
// Сначала необходимо обеспечить наследование свойств суперкласса,
// создав ссылку на функциюконструктор суперкласса и затем
// вызвав функциюконструктор внутри подкласса.
this.base = Shape;
this.base(centerX, centerY, color);
// Создать остальные свойства подкласса
this.radius = radius;
};
// Явно присоединить прототип подкласса к суперклассу, чтобы любые новые
// свойства, динамически добавляемые к суперклассу, появлялись и в подклассе
Circle.prototype = new Shape;
// Создание экземпляра
c = new Circle(10, 20, "blue", 2);
// Окружность ЯВЛЯЕТСЯ фигурой

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



Оцените статью: (0 голосов)
0 5 0

Статьи из раздела Dojo на эту тему:
JavaScript – это не Java
Вызов унаследованных методов
Имитация классов с использованием средств Dojo
Множественное наследование посредством смешивания классов
Основной шаблон создания класса