 Добро пожаловать,
|
|
|
|
|
|
Книги-online
ООП во Flash 5: Глоссарий
<<
ООП во Flash 5
>>
Глоссарий
Что здесь надо изменить: Очень старо, глупо и неточно, надо бы обновить или переписать! Описания должны быть более короткими, с одним примером и в сравнении с JAVA, при необходимости...
Класс (Class)
В JAVA, сначала создается дизайн для объекта, а уже потом на основе этого дизайна создается объект. Дизайн - это класс, а объекты - экземпляры. В ActionScript функция может быть использована, как шаблон дизайна или может быть запущена напрямую. Технически в ActionScript нет классов, но класс это нечто вроде кастрированной функции, такая функция может быть использована только в качестве шаблона (template). Таким образом, если используете функцию ТОЛЬКО, как шаблон, то можете думать о ней, как о классе.
Проводя параллель с Flash, можно сказать, что символы в библиотеке, это ваши классы (то есть ещё не использованные шаблоны). Каждый раз, когда вы перетаскиваете один из них на вашу "рабочую площадку", он становится экземпляром (то есть новым объектом, созданным с помощью нового шаблона). Вы не можете видеть их в конечном SWF файле, если вы не "вытащили" их из библиотеки на рабочую площадку (кстати, они даже не экспортируются, до тех пор, пока вы не перетащите их на рабочую площадку или пока не установите для них привязку к библиотеке).
Пример:
// ********** Class School **********
function School( name )
{
this.name = name;
}
school1 = new School( "UTOO" ); // экземпляр, названный school1
school2 = new School( "FLU" ); // экземпляр, названный school2
school3 = new School( "TukU" ); // экземпляр, названный school3
В данном куске кода School, это класс, а school1, school2, и school3 - экземпляры класса School. Согласно общепринятым правилам кодирования, имена классов начинаются с заглавной буквы, так что вы можете легко отличить их от экземпляров, имена которых обычно начинаются со строчных букв. (Наверное, так получилось из-за того, что классы более "важны")
school1.name is "UTOO"
school2.name is "FLU"
school3.name is "TukU" (University of Tuktoyuktuk!)
а в этом примере мы решили ни о чём не "спрашивать" School напрямую, потому что School, это класс и следовательно, это не реальный объект, только шаблон. Ведь мы же не станем пытаться найти _x координату чего-либо в библиотеке.
Экземпляр (Instance)
Экземпляр - объект, созданный из шаблона. Шаблон, это функция, которую часто называют классом. Во Flash, всё, что у есть вас в конечном SWF файле, всё это экземпляры чего-нибудь из библиотеки (только не говорите, что делаете фон из больших прямоугольников, не являющихся символами).
Ключевой момент: каждый экземпляр может иметь различные свойства, как во Flash, где экземпляры могут быть масштабированы, раскрашены и озаглавлены по-разному или иметь разные _x и _y координаты.
function Point( x, y )
{
this.x = x;
this.y = y;
}
pt0 = new Point( 5, 7 ); // pt0 теперь экземпляр класса Point'
pt1 = new Point( 3, 9 ); // каждый из них имеет разные свойства each
pt2 = new Point( 9, 1 ); // как видите, pt2.x равен 9,а pt2.y равен 1
Аргументы (Arguments)
Аргументы - это то, что передаётся в функции через круглые скобки. Всё, что передаётся таким образом, выровнено один к одному с аргументами, определёнными в функции. Всегда старайтесь давать "говорящие" имена с обеих сторон. Помните, что ситуация подобная той, что приведена в примере ниже, не приравняет x к нулю, а y к 30:
function Point( x, y )
{
this.x = x;
this.y = y;
}
var y = 30;
p = new Point( y ); // так "x" будет равен 30, а "y" нулю
this
this - относится к созданному экземпляру, а не к классу, из которого он был создан. А как во Flash? Допустим, у вас есть мувиклип под названием Graphic1 (почему бы нет?), вы использовали его на рабочей площадке дважды и дали экземплярам имена mc0 и mc1. Если вы используете слово this внутри мувиклипа Graphic1, то оно будет обращаться к экземпляру mc0 (если это mc0), и к экземпляру mc1, (если это mc1). Если вы используете trace ( this._x ); в окне мувиклипа Graphic1, то вы отследите _x расположение каждого клипа.
В ActionScript всё работает точно так же. this обращается к текущему экземпляру, а не к классу. Если рассмотреть пример на Flash'е, то:
function Graphic1 ( x, y, name, xScale, yScale, rotation )
{
this.x = x;
this.y = y;
this.name = name;
this.xScale = xScale;
this.yScale = yScale;
this.rotation = rotation;
}
instance0 = new Graphic1( 100, 100, "mc0", 100, 100, 45 );
instance1 = new Graphic1( 444, 222, "mc1", 200, 200, 30 );
Как видите, теперь есть два экземпляра, каждый со своими свойствами. Вы можете сопоставить каждый проходящий аргумент с именем каждого аргумента в классе Graphic1 (обратите внимание, что пробелов в именах функций быть не может!). Само по себе это конечно ещё не создаёт мувиклипа. Это просто несколько экземпляров класса в ActionScript, ничего конкретного. Двигаемся дальше, ребята. Поехали!..
Область видимости (Scope)
Массив аргументов (Agruments array)
Ещё немного об аргументах. В ActionScript вы можете оперировать сразу несколькими аргументами, различающимися в функции. Вы спросите: "А зачем нам это?" Ну, скажем, у вас есть класс, который хранит имена людей. Так как полное имя человека содержит фамилию, имя и отчество, ваш класс скорее всего будет выглядеть вот так:
function setName( first, middle, last )
{
this.firstName = first;
this.middleName = middle;
this.lastName = last;
}
person0 = new setName( "John", "Hopkins", "University" );
... никаких проблем. Хотя постойте! А как же быть с теми, чьи отчества нам не известны? Вот незадача! Ну да ладно. Мы можем оперировать двумя аргументами, если нет отчества и тремя, если оно есть. Просто проверим, обработано ли последнее значение перед тем, как вписать отчество:
function setName( last, first, middle )
{
this.lastName = last;
this.firstName = first;
if (middle <> null)
{
this.middleName = middle;
}
}
person0 = new setName( "university", "John", "Hopkins");
person1 = new setName( "Catraz", "Al" );
person2 = new setName( "Kahaule", "Al" );
person3 = new setName( "Krisnia", "Harry" );
Замечательно! Работает!.. Но как же быть с именами японцев и других "алиенов", которые пишут имя в конце, а фамилию в начале? Наверное, вы попробуете поменять "имя" на "фамилию". Теперь самое время вспомнить французов, а заодно и их ближайших родственников :))) Такие, как Жан Пьер Жозе деБрюйи или ещё лучше вот такое имя Гастон Бернар Жозе Рене даЛак ауФонтен Баге деБрюйи. Похоже, у нас появились проблемы. Непонятно, сколько имён мы передаёт в setName(). К счастью в каждой функции есть встроенный объект под названием (как вы, наверное, уже догадались) "аргументы" (arguments). Это объект (а не группа), хранящий прошедшие аргументы в форме:
arguments[0]
arguments[1]
arguments[2]...
Заметьте, что объект "аргументы" доступен только внутри функции, что логично, так как прошедшие аргументы, локальны по определению. Теперь вы можете сотворить что-нибудь вроде:
// поставим отчество после фамилии и имени
function setName( family, given )
{
this.familyName = family;
this.givenName = given;
if (arguments[2] <> null)
{
this.middleName = new Array();
for( var i = 2; i < arguments.length; i++)
{
this.middleName[i-2] = arguments[i];
}
}
}
person0 = new setName( "Robin", "Sean", "Debreuil"
);
person3 = new setName( "Debreuil", "Summer" );
person4 = new setName( "Debreuil", "Jean", "Pierre", "Josheph" );
person5 = new setName( "Debreuil", "Gaston", "Bernard", "Josheph",
"Rene", "d'Lac", "au'Fontaine", "Baguette" );
trace( person5.middleName.toString() );
// возврат будет выглядеть так:
// Bernard, Josheph, Rene, d'Lac, au'Fontaine, Baguette
Если ваш setName остаётся вообще без аргументов, то можно прикупить их или покопаться в Monty Python, кстати, не забудьте взять чек. Если вы думаете, что проблема уже решена, то вспомните об именах китайцев. У них последовательность такова: фамилия, имя, имя. Наверное, в этом случае вам придётся разрешить пробелы в именах (обычно они пишутся в кодировке Unicode, которую Flash 5 не поддерживает). Ну а как быть, например, с "артистом, которого звали 'Принц'"? Нравится он вам или нет, но как не восторгаться огромным списком таких имён во всех базах данных мира! Интересно, придуман ли для этого уже новый символ в Unicode?
Ну хорошо, а как обстоит дело с Flash? Какова альтернатива? Вот вы создаёте новый символ в библиотеке, передаёте ему аргументы, например, _x, _y и _level в зависимости от того, куда вы его помещаете. Такие параметры, как _xScale не установлены (и получают значения по умолчанию, в нашем случае - '100'). Однако, если дублировать экземпляр символа, то вся информация экземпляра передаётся новому экземпляру, как будто вы передаёте одну и ту же функцию (createInstanceOfSymbol) и нескольким аргументам, число которых будет зависеть от того, как именно вы решили всё это построить.
Прототип (prototype)
Прототип - место, откуда класс получает дополнительные методы/свойства. Его уровень тот же, что и у класса.
__proto__
__proto__ - место, откуда объект наследует методы. Одним уровнем выше класса.
callee
callee - это часть объекта arguments, который есть у любой функции. Вы обращаетесь к нему вот так: arguments.callee. Он возвращает текущую функцию (а не <строка> текст текущей функции, как это реализовано в JavaScript). Это логично, так как во Flash нельзя оценить скрипт в самом начале. Немного похоже на this, не так ли? Но this указывает на текущий экземпляр, а не на текущую функцию. Кстати, доступ к arguments.callee есть только в пределах функции.
arguments.caller не поддерживается в ActionScript (это выражение обращается к объекту, который вызвал текущую функцию), JavaScript от него уже тоже отказывается.
А вот arguments.length в ActionScript поддерживается. Это выражение обращается к числу прошедших аргументов. Его не будет видно в петле (loop'е) 'for in' объекта arguments, а вот callee будет там виден, так что будьте внимательны. (Откровенно говоря, я думаю, что и callee тоже не должен быть виден и похоже, что в этом разработчики JavaScript со мной солидарны).
super
super - (java) указывает на то, от чего унаследован текущий класс. Используется, чтобы указать, какой конструктор наследник должен использовать, вызывая конструктор-родитель (его можно вызвать только первым и всего один раз). Также часто используется для получения метода или свойства, наследуемого, перезаписанного наследником. Вообще очень похож на __proto__ в ActionScript.
constructor
parent
child
grandchild
subClass
superClass
method
|
|