Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

Создание иерархии объектов в JavaScript




Как отмечалось выше (см. 4.4.9), в объектно-ориентированном программировании классы образуют иерархическую систему, т.е. одни классы являются наследниками других классов. Одним из преимуществ объектно-ориентированного подхода является понятие наследования свойств и методов классов-предков в классах-потомках. Это означает, что в классе-потомке можно использовать свойства и методы, определенные в классах-предках. Если свойство или метод в каком-либо классе-потомке имеет другой значение и алгоритм реализации, их следует переопределить в этом классе с тем же именем. Механизм наследования в классе-потомке реализуется следующим образом: при использовании для объекта в классе-потомке какого-либо свойства или вызове метода, используется свойство или метод данного класса, если они определены в этом классе, иначе классы просматриваются вверх по иерархии и ищется ближайшее определение данного свойства или метода. Найденное свойство подставляется в выражении для свойства, а метод вызывается с заданными параметрами.

Напрямую наследование не реализовано в JavaScript, однако, используя методы call() и apply() объекта Function, можно реализовать описанный выше механизм.

Функция

call(параметр, аргумент-1, аргумент-2,…)

вызывает метод другого объекта с целью выполнения его для данного объекта. Аргумент параметр задает параметр для вызывающего объекта (обычно ключевое слово this, т.е. вызов для данного объекта). Остальные аргументы: аргумент-1, аргумент-2 и другие задают аргументы, необходимые для вызова заданной функции-конструктора или метода другого объекта.

Функция

apply(параметр, аргументы)

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

Если функции call() или apply() применены к функции-конструктору какого-либо объекта, все методы и свойства этого объекта становятся доступным в объекте, вызвавшем функцию call()или apply(), если они не переопределены в вызвавшем объекте. Таким образом, применение этих функций позволяет неявно создавать иерархию классов в JavaScript с использованием механизма наследования.

 

 

Пример 4.4.65. Использование иерархии объектов в JavaScript:

// Объявления глобальной переменной

// для имени объекта

objectName = "";

 

 

// Объявления глобальной переменной

// для строки сообщений о вызове функций

callOutput = ""

// Функция-конструктор объекта

// Rectangle (прямоугольник)

function Rectangle(a, b)

{

// Свойство a: одна сторона прямоугольника

this.a = a;

// Свойство b: другая сторона прямоугольника

this.b = b;

// Метод определения периметра прямоугольника

this.perimeter = function()

{

// Вывод в строку сообщений о вызове функций

callOutput +=

"\n Rectangle.perimeter для " + objectName

// Вычисление и возврат

// периметра прямоугольника

return 2*this.a + 2*this.b;

}

// Метод определения площади прямоугольника

this.area = function()

{

// Вывод в строку сообщений о вызове функций

callOutput +=

"\n Rectangle.area для " + objectName;

// Вычисление и возврат

// площади прямоугольника

return this.a*this.b;

}

// Метод преобразования объекта Rectangle в строку

this.toString = function()

{

// Вывод в строку сообщений о вызове функций

callOutput +=

"\n Rectangle.toString для " + objectName

// Преобразование свойств прямоугольника

// в строку

return "(" + this.a + "," + this.b + ")";

}

}

 

 

// Функция-конструктор объекта

// Square (квадрат)

function Square(a)

{

// Вызов конструктора объекта Rectangle

Rectangle.call(this, a, a);

// Метод определения площади для квадрата

this.area = function()

{

// Вывод в строку сообщений о вызове функций

callOutput += "\n Square.area для " + objectName

// Вычисление и возврат площади квадрата

return this.a*this.a;

}

}

// Функция-конструктор объекта

// Rhomb (ромб)

function Rhomb(a, alpha)

{

// Свойство alpha: угол между сторонами ромба

this.alpha = alpha;

// Вызов конструктора объекта Square

Square.apply(this, arguments);

// Метод определения площади ромба

this.area = function()

{

// Вывод в строку сообщений о вызове функций

callOutput += "\n Rhomb.area для " + objectName

// Вычисление и возврат площади ромба

return this.a*this.a*Math.sin(Math.PI*alpha/180);

}

// Метод преобразования объекта Rhomb в строку

this.toString = function()

{

// Вывод в строку сообщений о вызове функций

callOutput +=

"\n Rhomb.toString для " + objectName

// Преобразование свойств объекта Rhomb

// в строку

return "(" + this.a + "," + this.alpha + ")";

}

}

// Определение объекта Rectangle

// как прототипа для объекта Square

Square.prototype = Rectangle.prototype;

// Определение объекта Square

// как прототипа для объекта Rhomb

Rhomb.prototype = Square.prototype;

// Создание объекта rectangle1 типа Rectangle

rectangle1 = new Rectangle(3,5);

// Задание имени объекта для rectangle1

objectName="rectangle1";

// Вывод характеристик объекта rectangle1

alert("rectangle1=" + rectangle1.toString() +

" Периметр: " + rectangle1.perimeter() +

" Площадь: " + rectangle1.area());

// Вывод списка вызовов функций

// для объекта rectangle1

alert("Вызовы функций: " + callOutput);

// Создание объекта square1 типа Square

square1 = new Square(5);

// Чистка списка вызовов функций

callOutput = "";

// Задание имени объекта для square1

objectName="square1";

// Вывод характеристик объекта square1

alert("square1=" + square1.toString() +

" Периметр: " + square1.perimeter() +

" Площадь: " + square1.area());

// Вывод списка вызовов функций

// для объекта square1

alert("Вызовы функций: " + callOutput);

// Создание объекта rhomb1 типа Rhomb

rhomb1 = new Rhomb(5, 45);

// Чистка списка вызовов функций

callOutput = "";

// Задание имени объекта для rhomb1

objectName="rhomb1";

// Вывод характеристик объекта rhomb1

alert("rhomb1=" + rhomb1.toString() +

" Периметр: " + rhomb1.perimeter() +

" Площадь: " + rhomb1.area());

// Вывод списка вызовов функций

// для объекта square1

alert("Вызовы функций: " + callOutput);

// Определение и вывод прототипов объектов

alert("Square - прототип объекта square1?" +

" Ответ: " +

Square.prototype.isPrototypeOf(square1) +

"\nRectangle - прототип объекта square1?" +

" Ответ: " +

Rectangle.prototype.isPrototypeOf(square1) +

"\nRhomb - прототип объекта rhomb1?" +

" Ответ: " +

Rhomb.prototype.isPrototypeOf(rhomb1) +

"\nSquare - прототип объекта rhomb1?" +

" Ответ: " +

Square.prototype.isPrototypeOf(rhomb1) +

"\nRectangle - прототип объекта rhomb1?" +

" Ответ: " +

Rectangle.prototype.isPrototypeOf(rhomb1));

В этом фрагменте сценария задана иерархия объектов Rectangle (прямоугольник), Square (квадрат) и Rhomb (ромб), представленная на рис. 4.4.1.

Рис. 4.4.1. Иерархия классов Rectangle, Square и Rhomb

 

Для объекта Rectangle определены свойства a и b, а также методы perimeter(), area() и toString().

Для создания экземпляра объекта Square в функции-конструкторе этого объекта вызывается функция-конструктор объекта Rectangle. Кроме этого, для объекта Square переопределен метод area().

Для создания экземпляра объекта Rhomb в функции-конструкторе этого объекта вызывается функция-конструктор объекта Square. Кроме этого, для объекта Rhomb переопределены метод area() и toString().

Вывод характеристик созданных объектов rectangle1, square1 и rhomb1, вызываемые функции при выводе этих объектов, а также прототипы для созданных объектов, полученные с помощью свойства prototype объекта Object (см. 4.4.11.9.2), приведены ниже:

 



Поделиться с друзьями:


Дата добавления: 2014-01-05; Просмотров: 656; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.142 сек.