Московский физико-технический институт
Опубликован: 23.12.2005 | Доступ: свободный | Студентов: 2766 / 183 | Оценка: 4.61 / 4.44 | Длительность: 27:18:00
ISBN: 978-5-9556-0051-2
Лекция 2:

Базовые понятия 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 помещены и математические константы (пи, основание натуральных логарифмов, некоторые часто используемые корни и логарифмы). Ряд других важных функций Флэш МХ, которые по смыслу могли бы быть глобальными, тоже являются методами некоторых системных объектов. Но об этих функциях нам еще представится случай упомянуть в то время, когда про соответствующие объекты зайдет разговор.