Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
as3_learning.pdf
Скачиваний:
43
Добавлен:
21.05.2015
Размер:
1.8 Mб
Скачать

ИЗУЧЕНИЕ ACTIONSCRIPT 3.0

125

Объектно-ориентированное программирование на языке ActionScript

Каждый прямоугольник в схеме представляет объект. Каждый объект в схеме имеет подстрочный символ «А», который указывает на то, что он принадлежит классу А. Объект класса (СА) содержит ссылки на ряд других важных объектов. Объект признаков экземпляра (ТА) хранит свойства экземпляра, объявленные в определении класса. Объект признаков класса (ТСА) представляет внутренний тип класса и хранит статические свойства, определенные классом (подстрочный символ «С» обозначает «класс»). Объектом прототипа (PA) всегда называется объект класса, к которому он изначально был присоединен с помощью свойства constructor.

Объект признаков

Объект признаков, впервые введенный в версии ActionScript 3.0, служит для повышения производительности. В предыдущих версиях ActionScript, поиск имени мог занимать много времени, так как проигрывателю Flash Player требовалось пройти всю цепочку прототипов. В ActionScript 3.0 поиск имени выполняется намного эффективней и быстрей, так как наследуемые свойства копируются из суперклассов в объект признаков подклассов.

Программный код не может обратиться к объекту признаков напрямую, но его присутствие повышает производительность и оптимизирует использование памяти. Объект признаков предоставляет для AVM2 подробные сведения о макете и содержимом класса. Располагая такими данными, AVM2 может значительно сократить время выполнения, так как виртуальная машина во многих случаях создает прямые инструкции для обращения к свойствам или непосредственно вызывает методы, не затрачивая времени на поиск имен.

Благодаря объекту признаков, объем памяти, занимаемый объектом, может быть намного меньше, чем у подобных объектов в предыдущих версиях ActionScript. Например, если класс не объявлен как динамический (то есть является фиксированным), его экземпляру не требуется хэш-таблица для динамически добавляемых свойств, и он может содержать лишь указатель на объекты признаков и несколько слотов для фиксированных свойств, определенных в классе. В результате, объект, который требовал 100 байтов памяти в ActionScript 2.0, в версии ActionScript 3.0 будет требовать лишь 20 байтов.

Примечание. Объект признаков — это внутренняя деталь реализации. Нельзя гарантировать, что он не изменится или совсем не исчезнет в будущих версиях ActionScript.

Объект прототипа

Каждый объект класса ActionScript имеет свойство prototype, которое представляет собой на объект прототипа этого класса. Объект прототипа является наследием ActionScript как языка на базе прототипов. Дополнительные сведения см. в разделе «История объектно-ориентированного программирования на языке ActionScript».

Свойство prototype предназначено только для чтения: его нельзя изменить так, чтобы оно указывало на другие объекты. А в предыдущих версиях ActionScript свойство prototype можно было переназначить, чтобы оно указывало на другой класс. Хотя свойство prototype доступно только для чтения, это ограничение не распространяется на указываемый им объект прототипа. Другими словами, к объекту прототипа можно добавлять новые свойства. Свойства, добавляемые к объекту прототипа, совместно используются всеми экземплярами класса.

Цепочка прототипов, которая являлась единственным механизмом наследования в предыдущих версиях ActionScript, выполняет лишь второстепенную роли в ActionScript 3.0. Основной механизм наследования, то есть наследование фиксированных свойств, осуществляется на внутреннем уровне объектом признаков. Фиксированное свойство — это переменная или метод, объявленный как часть определения класса. Наследование фиксированных свойств также называется наследованием класса, так как этот механизм наследования связан с такими ключевыми словами, как class, extends и override.

Последнее обновление 12.5.2011.

ИЗУЧЕНИЕ ACTIONSCRIPT 3.0

126

Объектно-ориентированное программирование на языке ActionScript

Цепочка прототипов обеспечивает альтернативный механизм наследования, отличающийся от наследования фиксированный свойств большей динамичностью. Объект прототипа класса можно добавлять свойства не только в составе определения класса, но и во время выполнения через свойство prototype объекта класса.

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

Рассмотрим присоединение нескольких свойств к объекту прототипа на примере класса Object. Методы toString() и valueOf() класса Object на самом деле являются функциями, которые назначены свойствам объекта прототипа класса Object. Ниже приводится пример того, как может выглядеть объявление этих методов теоретически (фактическая реализация выглядит по-другому из-за деталей реализации).

public dynamic class Object

{

prototype.toString = function()

{

// statements

};

prototype.valueOf = function()

{

// statements

};

}

Как говорилось выше, свойство можно присоединить к объекту прототипа класса за рамками определения класса. Например, метод toString() можно также определить за пределами определения класса Object, как показано ниже.

Object.prototype.toString = function()

{

// statements

};

Однако, в отличие от наследования фиксированных свойств, наследование прототипа не требует ключевого слова override, если требуется переопределить метод в подклассе. Например. если требуется переопределить метод valueOf() в подклассе класса Object, это можно сделать одним из трех методов. Во-первых, можно определить метод valueOf() для объекта прототипа подкласса в определении класса. Следующий код создает подкласс Foo класса Object и переопределяет метод valueOf() объекта прототипа Foo в составе определения класса. Так как каждый класс является наследником класса Object, использовать ключевое слово extends не требуется.

dynamic class Foo

{

prototype.valueOf = function()

{

return "Instance of Foo";

};

}

Во-вторых, можно определить метод valueOf() для объекта прототипа класса Foo в составе определения класса, как в следующем коде.

Foo.prototype.valueOf = function()

{

return "Instance of Foo";

};

Последнее обновление 12.5.2011.

ИЗУЧЕНИЕ ACTIONSCRIPT 3.0

127

Объектно-ориентированное программирование на языке ActionScript

В-третьих, можно определить фиксированное свойство valueOf() в составе класса Foo. Этот метод отличается от остальных тем, что в нем объединено наследование фиксированных свойств с наследованием прототипов. Если в каком-либо подклассе класса Foo потребуется переопределить метод valueOf(), необходимо использовать ключевое слово override. Следующий код демонстрирует определение метода valueOf() в качестве фиксированного свойства класса Foo.

class Foo

{

function valueOf():String

{

return "Instance of Foo";

}

}

Пространство имен AS3

В результате существования двух механизмов наследования, наследования фиксированных свойств и наследования прототипов, появляется интересная проблема совместимости в отношении свойств и методов базовых классов. Для совместимости со спецификацией языка ECMAScript, на которой основан ActionScript, требуется наследование прототипов, то есть методы и свойства базового класса должны определяться в объекте прототипа класса. С другой стороны, для совместимости с ActionScript 3.0 требуется наследование фиксированных свойств, то есть свойства и методы базового класса присоединяются через определение класса с помощью ключевых слов const, var и function. Кроме того, использование фиксированных свойств вместо свойств прототипов может значительно повысить производительность во время выполнения.

ActionScript 3.0 решает эту проблему с помощью использования для основных классов как наследования прототипов, так и наследования фиксированных свойств. Каждый базовый класс содержит два набора свойств и методов. Один набор определяется для объекта прототипа с целью обеспечения совместимости со спецификацией ECMAScript, а другой определяется с использование фиксированных свойств и пространством имен AS3 для обеспечения совместимости с ActionScript 3.0.

Пространство имен AS3 обеспечивает удобный механизм выбора одного из двух наборов свойств и методов. Если не используется пространство имен AS3, экземпляр базового класса наследует свойства и методы, определенные в объекте прототипа базового класса. Если используется пространство имен AS3, экземпляр базового класса наследует версии AS3, так как фиксированные свойства всегда имеют более высокий приоритет, чем свойства прототипа. Другими словами, если доступно фиксированное свойство, оно всегда используется вместо одноименного свойства прототипа.

Можно избирательно использовать AS3-версию свойства или метода, указав его с помощью пространства имен AS3. Например, следующий код использует AS3-версию метода Array.pop().

var nums:Array = new Array(1, 2, 3); nums.AS3::pop();

trace(nums); // output: 1,2

Также можно использовать директиву use namespace, чтобы открыть пространство имен AS3 для всех определений в блоке кода. Например, следующий код использует директиву use namespace, чтобы открыть пространство имен AS3 для методов pop() и push().

use namespace AS3;

var nums:Array = new Array(1, 2, 3); nums.pop();

nums.push(5);

trace(nums) // output: 1,2,5

Последнее обновление 12.5.2011.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]