Казахстан, Алматы, Гимназия им. Ахмета Байтурсынова №139, 2008 |
Базовые понятия Action Script
Список встроенных типов
Применение оператора typeof
В некотором смысле понятие "встроенные типы Флэш МХ" не является хорошо определенным. Скажем, встроенный или не встроенный тип - компонент "выпадающий список" из библиотеки компонентов? Мы все же ограничимся наиболее четким из возможных определений, а именно: встроенными типами будем называть только те, для которых специальный оператор typeof выдает различные значения. Синтаксис использования оператора typeof следующий:
typeof <выражение>
Если вам больше нравится рассматривать typeof как функцию, то можно ставить скобки и писать
typeof (<выражение>)
Оператор этот выдает строчку, которая содержит название типа значения, возвращаемого переданным typeof выражением. Строчка при этом приводится к нижнему регистру, как показано в таблице 2.1. В таблице также указано, как воспринимаются объекты, которые пользователь может создавать "руками" - то есть клипы, кнопки и текстовые поля.
Видно, что из создаваемых визуально объектов только клипы оператор typeof "отличает особо". Что же касается собственно языка ActionScript, то для него разным (не сводимым к уникальному набору методов) поведением обладают лишь объекты типов Number, Boolean, String, Object, Function, undefined и null. Да еще Array имеет специальные операторы для конструирования. И только типы Number, Boolean, String, undefined и null бывают примитивными ("только для чтения").
Значения, возвращаемые typeof
Давайте теперь пронаблюдаем работу этого оператора на примерах. Пишем следующий код:
trace('typeof(5 + "") = ' + typeof(5 + "")); trace('typeof(a) = ' + typeof(a)); a = new Object(); trace('typeof(a) = ' + typeof(a)); a = null; trace('typeof(a) = ' + typeof(a)); a = {x: 20, y: "строчка"}; trace('typeof(a) = ' + typeof(a)); trace('typeof(a.x) = ' + typeof(a.x)); trace("typeof(String) = " + typeof(String)); trace("typeof(Function) = " + typeof(Function)); // Запись typeof(function) выдаст синтаксическую ошибку
На выходе получаем:
typeof(5 + "") = string typeof(a) = undefined typeof(a) = object typeof(a) = null typeof(a) = object typeof(a.x) = number typeof(String) = function typeof(Function) = function
Все результаты, кроме двух последних, говорят сами за себя (заметим только, что мы уже не первый раз используем сложение чисел и строчек; подробнее о том, как это работает, будет написано в следующем параграфе, а детали работы со строчками разобраны в четвертой лекции). Последние же два результата явно требуют комментариев. Впрочем, с подробным объяснением нам придется подождать до шестой лекции, в которой пойдет речь о классах во Флэш МХ. Пока же нам следует сказать, что во Флэше конструктор класса хранит в себе ссылку на полную информацию об этом классе. И, таким образом, когда мы хотим иметь дело с классом, а не с объектом, мы должны иметь дело с конструктором. Так вот, String - это имя конструктора класса String, а Function - имя конструктора класса Function, к которому принадлежат все функции во Флэше.
Function - редкий случай case-sensitivity для идентификатора
И, раз уж мы заговорили о классе Function, самое время обратить внимание на интересный феномен. Вообще-то во Флэше всякое имя функции - это обычный идентификатор. Более того, мы вполне можем считать имя функции именем переменной, ссылающейся на объект-функцию (подробнее об этом будет рассказано в пятой лекции). А идентификаторы Флэш (в отличие от ключевых слов) являются нечувствительными к регистру ( case-insensitive ). То есть, хотя ключевые слова, как в C++ или Java, к регистру чувствительны ( case-sensitive ), одни и те же идентификаторы можно писать как заглавными буквами, так и строчными (или же вперемешку). Мы, конечно, надеемся, что в своих программах вы не допустите беспорядка и не будете пользоваться этим свойством Флэш. И тем более не будете заводить идентификаторы вроде NEW (хотя это и разрешается). Забавно, что сами создатели Флэш небольшой беспорядок все-таки допустили: существует идентификатор Function (имя конструктора объектов-функций), и в то же время существует ключевое слово function , которое как раз и позволяет новые функции создавать. Использовать это ключевое слово в том месте, где по смыслу требуется идентификатор Function, вы, разумеется, не сможете (об этом и говорит последняя строчка-комментарий в вышеприведенном коде).
Подсказки по объектам встроенных типов
Отсутствие строгой типизации во Флэш МХ порождает одну специфическую трудность. Современные программные среды очень дружественно относятся к пользователю, в частности, предоставляя ему возможность автопродолжения набранного текста. Самый распространенный (и, наверное, самый полезный) вариант этой возможности выглядит так: вы набираете имя переменной, среда опознает тип этой переменной, и когда вы вслед за именем ставите точку, вам тут же выдается список полей и методов этого типа. Остается лишь выбрать нужный. Это избавляет от необходимости помнить детали написания множества методов, и вообще очень удобно. Но как организовать аналогичную подсказку в том случае, когда строго определенного типа переменная не имеет и может хранить ссылку на какой угодно объект? В этом случае программист должен сам помочь среде Флэш МХ обеспечить ему необходимые удобства. А именно, если программист заранее знает, что в некоторой переменной будет храниться ссылка на объект какого-то определенного типа (так и бывает в большинстве случаев), он может дать этой переменной имя с одним из заранее определенных суффиксов. Такие переменные среда Флэш МХ будет узнавать, и выдаст вам подсказку. Все такие суффиксы начинаются с символа подчеркивания, так что и вам и среде будет легко их узнавать. Например, имя переменной a_str сообщает среде Флэш МХ о том, что в этой переменной, скорее всего, содержится ссылка на строку и подсказку по ней следует выдавать, соответствующую типу String. Вот список предопределенных суффиксов и соответствующих им типов приведен в таблице 2.2.
Кроме этих суффиксов, Флэш МХ реагирует еще на несколько предопределенных имен, про которые ему заранее известно, что это объекты типа MovieClip. А именно, на _root (корневой клип данного флэш-ролика), _parent (в объектах типа MovieClip так называется поле, ссылающееся на родительский клип) и, наконец, на _level0, _level1, _level2 и т.д. (корневые клипы различных флэш-роликов, загруженных в плеер в настоящий момент). В лекции 12 мы расскажем вам о том, как самим делать подобные шаблоны, на которые реагирует среда разработки Флэш МХ.