Казахстан, Алматы, Гимназия им. Ахмета Байтурсынова №139, 2008 |
Базовые понятия Action Script
Функции и методы
В этом параграфе мы будем говорить о функциях очень кратко и приведем лишь пару примеров. Работа с функциями во Флэше богата интереснейшими деталями, и все они будут весьма подробно разобраны в лекции 5. При желании вы можете сразу перепрыгнуть к этой лекции и просмотреть ее первые параграфы, а затем вернуться сюда.
Пример глобальной функции
Если вы хотите определить функцию в глобальной области видимости, вам следует написать вот так
// Определяем глобальную функцию _global.printSomeStringWithFrame = function(str){ trace("***************************"); trace(str); trace("***************************"); } // Проверяем, как она работает printSomeStringWithFrame("Строка в рамке");
На выходе получаем:
*************************** Строка в рамке ***************************
то есть функция сработала. Еще раз отметим, что функция, определенная таким образом (как принадлежащая объекту _global ) будет видна в любом объекте или клипе без явного указания _global.
Пример метода
В качестве примера реализации метода мы переопределим метод toString() в созданном нами объекте (а заодно создадим и новый метод ).
obj = {a: 10, b: "Str"}; // Помещает поля объекта в строчку и возвращает ее obj.placeFieldsToStr = function(){ var str; str += "this.a = " + this.a + "\n"; str += "this.b = " + this.b; return str; } // Вызывает placeFieldsToStr и окружает звездочками // то, что она возвращает. obj.toString = function(){ var str = "***************************\n"; str += this.placeFieldsToStr(); return str + "\n***************************"; } // trace вызывает у объекта toString() // и выводит результат. Проверяем, // сработало ли переопределение. trace(obj);
В результате выполнения этого кода мы увидим:
*************************** this.a = 10 this.b = Str ***************************
Итак, созданные нами методы работают. И становится очевидно, что создавать глобальные функции и методы объектов - это практически одно и то же. Теперь мы видим, что глобальная функция - это просто метод объекта _global. Кстати, кроме того синтаксиса создания функций, который мы показали сейчас, есть и другой, возможно, более привычный. Тем не менее, о нем мы сейчас говорить не будем, поскольку он менее универсален и результаты его менее очевидны. Этот синтаксис описан в самом начале пятой лекции.
Заметьте, что значением выражения ( toString instanceof Object ) является true. То есть функция - это объект. Множество интересных следствий этого факта ожидает нас впереди.
Обязательно пишем this!
Вы, наверное, уже заметили, что в методах объекта obj, которые мы только что создали, встречается совершенно аномальное количество употреблений ключевого слова this. Точнее, аномальное для С++ или Java. А вот у Флэш МХ есть одна очень неприятная особенность: изнутри метода обратиться к полям и другим методам того же объекта можно, только употребив this явным образом. Если забыть поставить this - обращение будет к переменной того контекста, в котором создана функция. Что это за контекст - мы сейчас пояснять не будем (все пояснения вы найдете в пятой лекции), важно, что нужных нам полей и методов в этом контексте нет и в помине. Хотя Флэш и не подумает сообщать вам об ошибке, если вы забудете написать this. Если вы запрашиваете значение какой-то переменной, он вернет вам undefined. Еще хуже, если вы, напротив, присваиваете переменной какое-то значение: он заведет эту переменную там, где она совсем вам не нужна, а заметите вы это не сразу. Так что, если написанная вами функция не работает, в первую очередь проверяйте, не забыли ли вы написать this при обращении к полям и методам объекта. Не забывайте, что и к методам - тоже!
По ходу дела может возникнуть вопрос: если все равно приходится писать this, может быть, проще явно указывать имя объекта? В некоторых случаях так действительно можно делать. Но на самом-то деле в реальных программах мы будем обычно заводить методы у классов, а не у отдельных объектов. А в этом случае мы, конечно, не сможем предугадать, какие имена будут у объектов классов. Да и семантика страдает: читая программу и встретив обращение через конкретное имя объекта, мы будем воспринимать это как указание на то, что данная функция по смыслу своему может работать только с этим конкретным объектом. А видя this, мы, напротив, поймем, что речь идет просто об обращении метода объекта к его (объекта) собственным полям.
Встроенные функции
Большинство встроенных функций Флэш МХ являются методами объекта _global. Это означает, что вызывать их можно в любом месте (не указывая объект-хозяин). Важное исключение из этого правила - математические функции. Они представляют собой методы объекта Math, и этот объект нужно явным образом указывать при вызове функции. Такое не слишком удобное решение происходит из языка Java, где, однако, по-другому сделать было нельзя. А в JavaScript и, соответственно, во Флэш МХ, видимо, решили создать условия для удобного переноса туда Java-кода (по крайней мере, использующего стандартные математические функции). Все необходимые математические функции в этом объекте присутствуют, вплоть до удобнейшей функции atan2 (которая, как вы, наверное, помните, служит для облегчения перевода в полярные координаты). Заодно в объекте Math помещены и математические константы (пи, основание натуральных логарифмов, некоторые часто используемые корни и логарифмы). Ряд других важных функций Флэш МХ, которые по смыслу могли бы быть глобальными, тоже являются методами некоторых системных объектов. Но об этих функциях нам еще представится случай упомянуть в то время, когда про соответствующие объекты зайдет разговор.