Диагностика, ремонт и защита


Просто как Flash


Скорее всего вы уже знакомы со словом "экземпляр" (instance) по работе с Macromedia Flash. Вы создаёте экземпляры символов, просто "перетаскивая" их из библиотеки на сцену. Это то же самое, что и создание экземпляра из класса, абсолютно то же самое. "Вытаскивая" символ на сцену, вы тем самым создаёте "новый" объект. Таким образом создаётся пустой контейнер (если это мувиклип, то пустой мувиклип). Потом этот контейнер передается шаблону класса и "проходит через него", получая по дороге различные свойства (как на конвейере). Разумеется, класс это описание символа, которое вы находите в библиотеке, а свойства - графические элементы в символе (то, что кладется в коробку на конвейере). Должно быть, вы уже поняли, почему очень удобно пользоваться шаблонами (template) для создания объектов во Flash'е. По тем же самым причинам удобно пользоваться шаблонами и в ActionScript.

Возможно, вам кажется, что не всякий класс получает "безымянный" контейнер. Это отчасти верно, например: A = function() { return 7; } y = A(); // 7

Первое, что следует отметить, это не класс. Классы никогда не возвращают значений и они всегда вызываются с помощью оператора new. На самом же деле это метод (method), о котором речь пойдёт несколько позже. А пока вкратце скажем, что метод это функция (function), имеющая принадлежность к классу. Фактически термины "функция" и "метод" часто взаимозаменяемы. "Классы" же, это совсем другое дело. Как бы мы ни называли их, все функции "принимают" объекты и присваивают им значение this. Классы "принимают" пустые объекты, а методы принимают существующие объекты. Но вернёмся к нашим примерам...

Написав A(), может показаться, что мы никоим образом не отправляем объект в функцию, чтобы "налепить" на него свойства. Откуда бы ему взяться? Однако, если даже вы не определяете объект (как в случае с использованием new, или inst.A();), то в этом случае под объектом подразумевается (и соответственно направляется) текущий контейнер. Контейнер, в котором помещается весь этот код это, конечно же, _root (то есть _level0, если именно отсюда берётся код). Таким образом, используется именно этот контейнер. ( A() на самом деле означает _root.A(); ). Следующий код показывает это: A = function() { this.x = 5; // _root.x = 5 return 7; } var y = A(); trace (_root.x); // 5 trace (y); // 7

Как мы видим, _root был отослан в функцию и присвоен ключевому слову this. После выполнения функции, свойства, назначенные параметру this, также стали распространяться и на _root, как следует из вышеприведённого примера.

<<    ООП во Flash 5    >>

 









Начало  Назад  Вперед