Опубликован: 04.11.2006 | Доступ: свободный | Студентов: 4462 / 498 | Оценка: 4.46 / 3.96 | Длительность: 39:17:00
Урок 6:

Создание и модификация объектов

Создание методов для собственных классов

До сих пор объекты, которые мы создавали, имели свойства, значения которых мы могли использовать для вычислений и тому подобного, однако они не могли сами выполнять каких-либо задач. Сейчас вы поймете, что это означает – просто вспомните, что умеют делать встроенные объекты Flash:

  • Экземпляры фильмов-символов могут начать воспроизведение – play(), остановить – stop(), загрузить фильм – loadMovie(), получить URL – getURL() и так далее.
  • Экземпляры объекта Sound могут загрузить звук – loadSound(), установить громкость – setVolume(), установить баланс – setPan() и тому подобное.

А наши классы Person и Doctor ничего делать не могут, кроме как просто "присутствовать". В этом разделе мы постараемся изменить такое положение дел, создав для наших классов методы – это даст возможность экземплярам этих классов выполнять полезные задачи.

Прежде всего следует вам сказать, что метод – это не что иное, как функция, связанная с классом и помещенная в объект-прототип этого класса. Давайте начнем упражнение, и вы увидите, как это работает.

  1. Откройте class3.fla из папки Lesson06/Completed. Откройте панель Действия, выделите кадр 1. Удалите действия trace в конце скрипта, затем добавьте следующее:
Person.prototype.talk = function(){
  trace("Привет, меня зовут "+ this.name +". Мне "+ this.age +" лет.");
}

Примечание Можно создать метод другим способом:

//Сначала описываем функцию
function futureMethod(){
  trace("Привет, меня зовут "+ this.name +". Мне "+ this.age +" лет.");
}
//Назначаем эту функцию методом talk класса Person
Person.prototype.talk = futureMethod;

Вот и создан новый метод для класса объектов Person. Функция сделалась методом класса Person, поскольку мы поместили ее в объект-прототип класса Person.

Этот наш метод, который называется talk(), может быть использован любым экземпляром данного класса. У нас имеются экземпляры person1 и person2. Любой из этих экземпляров может использовать наш новый метод, вот таким образом:

person2.talk();

Этот метод выполняет лишь одну простую задачу: выводит сообщение в окне Выход при тестировании фильма. Как вы видели, в описании метода, в действии trace, использованы элементы this.name и this.age. Поскольку функция является методом, this есть ссылка на экземпляр, который вызвал этот метод. Таким образом, если этот метод вызывает person2, эти элементы будут означать person2.name и person2.age.

Примечание Если термин this используется в обычной функции, то он означает ссылку на монтажный стол, на котором находится функция.

  1. Поместите в конец скрипта следующую строку:
person2.talk();

Это приведет к тому, что person2 вызовет метод talk().

  1. Командой Управление > Проверить фильм (Control > Test Movie) запустите тест проекта.

Откроется окно Выход (Output), и в нем отобразится следующее:

Привет, меня зовут Derek. Мне 29 лет.

Итак, наш метод talk() дал возможность экземплярам нашего класса Person хоть что-то делать. Давайте немного расширим возможности этого метода.

  1. Закрыв тестовый фильм, вернитесь в среду разработки. Выделите кадр 1 и измените метод talk() следующим образом:
Person.prototype.talk = function(tone){
  var message = "Привет, меня зовут "+ this.name +". Мне "+ this.age +" лет.";
  if (tone == "крик"){
    trace(message.toUpperCase());
  }else{
    trace(message);
  }
}

Как видите, теперь метод принимает параметр tone. Метод будет действовать одним из двух способов в зависимости от значения параметра. Давайте рассмотрим подробнее обновленное описание метода.

Первым делом создается локальная переменная с именем message, которая получает значение, полученное из выражения. Выражение то же самое, которое мы прежде использовали в действии trace.

Примечание Как упоминалось в предыдущем уроке (о функциях), локальная переменная – это такая переменная, которая определена только внутри той функции, где она объявлена. Если бы мы не сделали переменную message локальной, она была бы доступна любому скрипту в любое время. Будучи локальной, она будет удалена, как только завершится выполнение метода.

После того, как переменная message получила значение, в действие вступает оператор if. Он проверяет значение tone: если оно равно "крик", то значение message преобразовывается – все буквы делаются заглавными – а затем выводится в окне Выход. Если tone имеет любое другое значение, message будет выведено обычным образом. Использование метода toUpperCase() объекта String демонстрирует, что метод одного класса может использовать методы других классов. Методы могут содержать действия, другие методы и так далее – практически все, что предоставляет ActionScript.

  1. Добавьте в конец скрипта следующую строку:
person2.talk("крик");

В результате person2 вызовет метод talk(), передав ему в качестве параметра значение "крик". Теперь обе последние строки вызывают метод talk(), но разными способами (в одном случае передается значение "крик"); окно Выход покажет нам оба результата.

  1. Командой Управление > Проверить фильм (Control > Test Movie) запустите тест проекта.

Откроется окно Выход (Output), и в нем отобразится следующее:

Привет, меня зовут Derek. Мне 29 лет.
ПРИВЕТ, МЕНЯ ЗОВУТ DEREK. МНЕ 29 ЛЕТ.

Теперь давайте рассмотрим еще один интересный аспект нашего метода talk().

  1. Закрыв тестовый фильм, вернитесь в среду разработки. Выделите кадр 1 и измените вызов метода talk() (две последние строки скрипта) следующим образом:
frankenstein.talk();
frankenstein.talk("крик");

Метод talk() принадлежит классу Person, однако, поскольку класс Doctor есть подкласс класса Person, экземпляры класса Doctor тоже имеют доступ к этому методу – как вы видите на примере экземпляра frankenstein.

Класс Doctor тоже может иметь свои, уникальные, методы – достаточно просто поместить нужные функции в объект Doctor.prototype, как мы сделали с объектом Person.prototype на шаге 1.

Примечание Если создать другой метод talk() – в объекте Doctor.prototype, то экземпляр frankenstein будет использовать именно этот метод, а не тот, что находится в Person.prototype. Ведь frankenstein – экземпляр класса Doctor, и поиск его методов происходит в первую очередь в объекте Doctor.prototype.

  1. Командой Управление > Проверить фильм (Control > Test Movie) запустите тест проекта.

Откроется окно Выход (Output), и в нем отобразится следующее:

Привет, меня зовут Frankenstein. Мне 85 лет.
ПРИВЕТ, МЕНЯ ЗОВУТ FRANKENSTEIN. МНЕ 85 ЛЕТ.

Наш метод talk() выполняет простейшую задачу, вообще же методы могут быть весьма сложными.

  1. Закрыв тестовый фильм, вернитесь в среду разработки. Сохраните свою работу как class4.fla.

Полученные знания о механике объектов пригодятся вам в следующих разделах, когда мы будем изучать способы расширения функциональности встроенных объектов Flash. Мы видели, как можно использовать объекты для организации данных и работы с ними, однако Flash – в первую очередь визуальное средство, и вы, возможно, недоумеваете, какую пользу могут принести объекты в этой сфере. Что ж, пришла пора об этом узнать.

Евгений Стародубцев
Евгений Стародубцев

Вот задание:

7. Открыв панель Действия (Actions) и установив ее в Экспертный режим(Expert Mode), выделите кадр 1 слоя Actions и введите следующий скрипт:

Галина Кузнецова
Галина Кузнецова

Добрый день.

Можно ли получить среду Flash для обучения бесплатно?

Ольга Ремез
Ольга Ремез
Латвия, Рига
Светлана Ведяева
Светлана Ведяева
Россия, Саратов