Logo GenDocs.ru

Поиск по сайту:  

Загрузка...

Курс лекции по дисциплине Современные программные средства - файл 05. ЯЗЫК ACTION SCRIPT.doc


Загрузка...
Курс лекции по дисциплине Современные программные средства
скачать (21152.1 kb.)

Доступные файлы (590):

Задание.doc21kb.05.02.2002 00:56скачать
Лекция_1.doc49kb.04.02.2004 09:27скачать
ЗАДАНИЕ.DOC37kb.13.02.2007 12:28скачать
Программирование с DAO и ADO.doc426kb.13.02.2007 17:20скачать
CRE_INFO.GID
CRE_INFO.HLP
Helpscr.doc213kb.11.09.1998 08:50скачать
README.TXT1kb.27.09.1998 08:05скачать
задание СПС лаб4.doc24kb.16.03.2005 12:15скачать
Задание.doc23kb.17.03.2006 16:06скачать
cube.swf
snegovic.swf
bubbles.fla
bubbles_Scene 1.swf
bubbles.swf
Animate-Shape Tween.fla
cube.fla
Dirt Gear.fla
Globe.fla
Sun Town.fla
Theater.fla
Writing Pen.fla
3d_animat.asp
3d_animat.swf
ani_but.asp
ani_but.swf
faq.asp
fla.asp
fonts.asp
f_viewer.swf
mail-list.asp
optimization.asp
player.swf
practic.swf
protect.asp
ruhelp.asp
rut.gif1kb.21.05.2000 22:16скачать
shortcuts.asp
sounds.asp
ssavers.asp
textfield.asp
trigger.asp
trigger.swf
2 Рисование.fla
5 Работа с текстом.fla
flash4_1_D.doc160kb.01.09.2001 06:27скачать
2 Слои.fla
flash4_2_layers.doc143kb.01.09.2001 06:27скачать
Имитация увеличительного стекла.doc32kb.05.04.2001 07:31скачать
3 Символы и Копии.fla
flash4_3_simbol.doc99kb.01.09.2001 06:29скачать
Skywriting.fla
Skywriting.swf
4 Кнопки.fla
5 Звуки.fla
flash4_5_sound.doc106kb.01.09.2001 06:30скачать
8 Анимация.fla
8 Анимация.swf
flash4_6_animation.doc98kb.01.09.2001 06:31скачать
Основы анимации.aviскачать
Macromedia Flash 5 (Лекция 1).doc217kb.19.11.2002 18:47скачать
test.swf
Вставка Flash.doc30kb.28.04.2004 15:17скачать
Вставка Flash-роликов в HTML.doc73kb.28.04.2004 11:10скачать
Использование SWiSH в HTML.doc80kb.28.04.2004 15:28скачать
Как вставить Flash в HTML.doc28kb.28.04.2004 15:40скачать
Код вставки SWF файла Flash MX.doc24kb.28.04.2004 15:54скачать
Am179.gif31kb.05.04.1998 14:42скачать
ANATOMY3.GIF12kb.20.02.1998 18:25скачать
ANATOMY5.GIF7kb.20.02.1998 18:23скачать
ANATOMY7.GIF10kb.20.02.1998 18:26скачать
anieyes.gif50kb.11.10.1998 03:43скачать
Aniheart.gif5kb.05.04.1998 14:46скачать
BAT.GIF13kb.20.02.1998 08:37скачать
BIRD2.GIF4kb.20.02.1998 08:23скачать
BULL1.GIF44kb.20.02.1998 08:25скачать
BULL.GIF15kb.20.02.1998 08:23скачать
BUTTE~56.GIF34kb.20.02.1998 08:18скачать
BUTTE~58.GIF51kb.22.02.1998 02:44скачать
CAT10.GIF25kb.20.02.1998 08:06скачать
CAT13.GIF20kb.20.02.1998 17:02скачать
CAT14.GIF9kb.20.02.1998 07:56скачать
CAT2.GIF28kb.20.02.1998 08:11скачать
CAT8.GIF12kb.20.02.1998 17:03скачать
CAT9.GIF3kb.20.02.1998 17:01скачать
DOG13.GIF5kb.22.02.1998 02:36скачать
DOG1.GIF12kb.20.02.1998 07:53скачать
DOLPHIN.GIF18kb.20.02.1998 16:53скачать
DOLPHINS.GIF18kb.20.02.1998 07:34скачать
DOVE.GIF102kb.20.02.1998 16:59скачать
EAGLES.GIF85kb.22.02.1998 02:45скачать
FISH.GIF31kb.20.02.1998 07:30скачать
FLAM~172.GIF10kb.20.02.1998 07:11скачать
FLYI~176.GIF17kb.20.02.1998 07:12скачать
FROG.GIF8kb.20.02.1998 07:09скачать
LEOPARD.GIF8kb.20.02.1998 06:56скачать
MONKEY2.GIF34kb.20.02.1998 06:59скачать
MOOSE.GIF19kb.20.02.1998 06:55скачать
MOUSE1.GIF27kb.20.02.1998 07:02скачать
MOUSE2.GIF11kb.20.02.1998 06:53скачать
MOUSE3.GIF39kb.20.02.1998 06:55скачать
MOUSE.GIF72kb.20.02.1998 16:53скачать
ORCA.GIF10kb.20.02.1998 06:52скачать
OWL.GIF34kb.20.02.1998 16:42скачать
POLA~232.GIF16kb.20.02.1998 06:52скачать
PTER~234.GIF14kb.20.02.1998 19:19скачать
PUMA.GIF10kb.20.02.1998 06:50скачать
REDWORMS.GIF4kb.20.02.1998 06:51скачать
SEAGULL.GIF5kb.20.02.1998 06:48скачать
SPIDER1.GIF7kb.20.02.1998 06:46скачать
SWAN.GIF31kb.20.02.1998 06:45скачать
TIGER1.GIF10kb.20.02.1998 06:42скачать
TIGER2.GIF39kb.20.02.1998 06:54скачать
TIGER3.GIF12kb.20.02.1998 06:40скачать
TIGER4.GIF6kb.20.02.1998 06:40скачать
TIGER5.GIF9kb.20.02.1998 06:40скачать
TIGER6.GIF22kb.20.02.1998 05:44скачать
TRACKS.GIF3kb.20.02.1998 05:35скачать
T-REX.GIF50kb.20.02.1998 16:42скачать
TURTLE2.GIF12kb.20.02.1998 05:31скачать
WORM.GIF4kb.20.02.1998 05:30скачать
ani-tri.gif2kb.03.11.1998 15:51скачать
A-ANI5.GIF38kb.20.02.1998 06:40скачать
ASTERO~8.GIF49kb.20.02.1998 16:40скачать
EARTH10.GIF24kb.20.02.1998 16:36скачать
EARTH12.GIF8kb.20.02.1998 16:33скачать
EARTH13.GIF36kb.20.02.1998 16:33скачать
EARTH14.GIF52kb.20.02.1998 16:34скачать
EARTH16.GIF15kb.20.02.1998 16:30скачать
EARTH18.GIF87kb.20.02.1998 16:35скачать
EARTH1.GIF10kb.20.02.1998 16:37скачать
EARTH2.GIF113kb.23.02.1998 14:01скачать
EARTH4.GIF21kb.20.02.1998 06:32скачать
EARTH6.GIF55kb.20.02.1998 16:47скачать
EARTH8.GIF18kb.20.02.1998 16:35скачать
EARTH9.GIF7kb.20.02.1998 06:23скачать
EARTHBUT.GIF8kb.20.02.1998 06:07скачать
EARTH.GIF28kb.20.02.1998 06:34скачать
GLDGLOBE.GIF87kb.20.02.1998 16:29скачать
GLOBE.GIF19kb.20.02.1998 06:07скачать
GP_GLO~6.GIF37kb.20.02.1998 06:07скачать
MOON1.GIF40kb.20.02.1998 06:04скачать
MOON2.GIF26kb.20.02.1998 16:25скачать
MOON3.GIF47kb.20.02.1998 06:04скачать
MOON.GIF14kb.20.02.1998 06:05скачать
PLANET1.GIF168kb.22.02.1998 23:17скачать
PLANET3.GIF146kb.20.02.1998 16:26скачать
PLANET.GIF20kb.20.02.1998 16:29скачать
PULSAR.GIF3kb.20.02.1998 05:48скачать
REDGLOBE.GIF68kb.20.02.1998 16:24скачать
SATURN.GIF30kb.20.02.1998 05:52скачать
SHINING.GIF7kb.20.02.1998 05:47скачать
SPIKE.GIF4kb.20.02.1998 05:48скачать
STAR1.GIF53kb.22.02.1998 22:22скачать
STAR2.GIF3kb.20.02.1998 05:48скачать
STAR3.GIF17kb.20.02.1998 05:45скачать
STAR4.GIF3kb.20.02.1998 05:40скачать
STAR5.GIF1kb.20.02.1998 05:39скачать
STAR6.GIF7kb.20.02.1998 05:41скачать
STAR7.GIF3kb.20.02.1998 05:41скачать
STAR8.GIF5kb.20.02.1998 05:39скачать
STAR.GIF2kb.20.02.1998 05:47скачать
STARRY.GIF9kb.20.02.1998 05:39скачать
STARS.GIF11kb.20.02.1998 05:52скачать
TWSTAR.GIF3kb.20.02.1998 05:37скачать
ABALL1AB.GIF9kb.20.02.1998 09:59скачать
ABALL1A.GIF7kb.20.02.1998 09:58скачать
ABALL2A.GIF9kb.20.02.1998 09:57скачать
ABALL3A.GIF9kb.20.02.1998 09:57скачать
ABALL4A.GIF9kb.20.02.1998 10:07скачать
ABALL6A.GIF9kb.20.02.1998 09:56скачать
AG_BALL3.GIF4kb.20.02.1998 09:58скачать
AN_ICONA.GIF6kb.20.02.1998 18:22скачать
BALL1.GIF4kb.20.02.1998 09:54скачать
BALL2.GIF2kb.20.02.1998 09:54скачать
BALL3.GIF4kb.20.02.1998 09:54скачать
BALL.GIF6kb.20.02.1998 09:57скачать
BLINE.GIF3kb.20.02.1998 09:53скачать
BLINK~42.GIF3kb.20.02.1998 09:53скачать
BLINKIE.GIF3kb.20.02.1998 09:53скачать
BLUBOU.GIF1kb.20.02.1998 09:52скачать
BLUEBALL.GIF9kb.20.02.1998 09:53скачать
BLUER~50.GIF11kb.20.02.1998 09:53скачать
BLUERED.GIF2kb.20.02.1998 09:52скачать
BLUES~52.GIF3kb.20.02.1998 09:52скачать
BLUEY~54.GIF10kb.20.02.1998 09:51скачать
BLUPULSE.GIF2kb.20.02.1998 09:51скачать
BNC_ANM.GIF5kb.20.02.1998 09:53скачать
BUBBLER.GIF6kb.20.02.1998 09:48скачать
CONENB.GIF50kb.20.02.1998 09:52скачать
GLOBE.GIF40kb.20.02.1998 18:25скачать
GOLD1.GIF2kb.20.02.1998 09:41скачать
GP_BUT27.GIF10kb.22.02.1998 23:59скачать
GP_BUT29.GIF18kb.20.02.1998 09:44скачать
GP_BUT37.GIF2kb.20.02.1998 09:37скачать
GP_BUT38.GIF1kb.20.02.1998 09:36скачать
GP_BUT39.GIF2kb.20.02.1998 09:39скачать
GP_BUT40.GIF7kb.20.02.1998 09:44скачать
GP_GLO~7.GIF77kb.24.02.1998 00:22скачать
GP_GLO~8.GIF6kb.20.02.1998 09:39скачать
GP_GLO~9.GIF5kb.20.02.1998 09:32скачать
GP_GRN~2.GIF13kb.20.02.1998 09:36скачать
GP_MOON.GIF8kb.20.02.1998 09:31скачать
GP_PIC3.GIF72kb.20.02.1998 09:36скачать
GP_PIC4.GIF119kb.24.02.1998 00:21скачать
G_SPIRAL.GIF9kb.23.02.1998 00:02скачать
PALLA.GIF8kb.20.02.1998 09:30скачать
PERLREDB.GIF2kb.20.02.1998 09:29скачать
PURPIN.GIF2kb.20.02.1998 09:29скачать
ROLLBALL.GIF5kb.20.02.1998 09:29скачать
ROTDONE.GIF25kb.20.02.1998 09:31скачать
SBUTTON.GIF15kb.20.02.1998 09:26скачать
SOC_ANM.GIF14kb.22.02.1998 23:59скачать
SPIK~126.GIF8kb.20.02.1998 09:22скачать
SQUI~128.GIF9kb.20.02.1998 09:29скачать
TCWD_106.GIF7kb.20.02.1998 05:29скачать
TCWD_118.GIF4kb.20.02.1998 05:29скачать
banner_3.gif14kb.22.12.1998 20:36скачать
1P_BAR1.GIF135kb.23.02.1998 20:41скачать
AG_BAR2.GIF3kb.20.02.1998 09:22скачать
ANIMA~22.GIF9kb.20.02.1998 09:21скачать
ANIM-BAR.GIF7kb.20.02.1998 09:20скачать
ANI-TUBE.GIF8kb.20.02.1998 09:19скачать
BAR_ANM.GIF7kb.20.02.1998 09:18скачать
BAR_EL.GIF11kb.20.02.1998 09:18скачать
BARMOVE.GIF28kb.20.02.1998 09:19скачать
BARSTAR.GIF5kb.20.02.1998 09:17скачать
BBOMB.GIF14kb.20.02.1998 09:17скачать
BEEP2.GIF4kb.20.02.1998 09:16скачать
BLOODBAR.GIF5kb.20.02.1998 09:17скачать
BLUEONE.GIF4kb.20.02.1998 09:16скачать
BLUERULE.GIF4kb.20.02.1998 09:16скачать
BLUETWO.GIF2kb.20.02.1998 09:15скачать
BOLT_ANI.GIF18kb.20.02.1998 09:15скачать
BOMBBAR.GIF11kb.20.02.1998 09:14скачать
BR_BAR.GIF12kb.20.02.1998 09:18скачать
BULBOUT.GIF2kb.20.02.1998 09:13скачать
BURST~70.GIF10kb.20.02.1998 09:14скачать
CANON.GIF15kb.20.02.1998 09:14скачать
CAT.GIF10kb.20.02.1998 09:16скачать
COLOR~82.GIF16kb.20.02.1998 09:17скачать
COLORBAR.GIF5kb.20.02.1998 09:13скачать
COLORLIN.GIF8kb.20.02.1998 09:13скачать
CON-BAR3.GIF7kb.20.02.1998 09:10скачать
COP.GIF13kb.20.02.1998 17:16скачать
DANCEBAR.GIF1kb.20.02.1998 09:09скачать
DOG_H~94.GIF64kb.20.02.1998 09:12скачать
DRIP1.GIF4kb.20.02.1998 09:09скачать
DRIP.GIF7kb.20.02.1998 09:09скачать
ELECTRIC.GIF6kb.20.02.1998 09:08скачать
FIREBAR2.GIF12kb.20.02.1998 09:09скачать
FIREBAR.GIF42kb.20.02.1998 09:12скачать
FLOW~110.GIF1kb.20.02.1998 09:07скачать
FUSS.GIF5kb.20.02.1998 09:07скачать
G_BAR_N3.GIF11kb.20.02.1998 09:08скачать
GEOBAR.GIF12kb.20.02.1998 09:09скачать
GP_BAR10.GIF12kb.20.02.1998 08:54скачать
GP_BAR11.GIF10kb.20.02.1998 17:12скачать
GP_BAR12.GIF18kb.20.02.1998 08:52скачать
GP_BAR1.GIF27kb.20.02.1998 09:05скачать
GP_BAR2.GIF45kb.20.02.1998 09:05скачать
GP_BAR3.GIF9kb.20.02.1998 17:16скачать
GP_BAR4.GIF13kb.20.02.1998 09:00скачать
GP_BAR5.GIF20kb.20.02.1998 09:00скачать
GP_BAR6.GIF17kb.20.02.1998 08:59скачать
GP_BAR7.GIF34kb.20.02.1998 17:13скачать
GP_BAR8.GIF62kb.23.02.1998 20:38скачать
GP_BAR9.GIF32kb.20.02.1998 08:59скачать
GP_GLO~5.GIF31kb.20.02.1998 08:55скачать
GREY~150.GIF14kb.20.02.1998 08:53скачать
HR1.GIF8kb.20.02.1998 08:49скачать
HR_S~156.GIF9kb.20.02.1998 08:50скачать
INDI~158.GIF10kb.20.02.1998 08:50скачать
JETRIGHT.GIF14kb.22.02.1998 02:46скачать
KILROY.GIF5kb.20.02.1998 08:48скачать
LASER.GIF6kb.20.02.1998 08:47скачать
LIBUNT.GIF1kb.20.02.1998 08:47скачать
LILRED.GIF3kb.20.02.1998 08:46скачать
LINE04C.GIF29kb.20.02.1998 17:15скачать
LINEDOT.GIF18kb.20.02.1998 08:47скачать
LOLLIPOP.GIF7kb.20.02.1998 17:11скачать
MATC~178.GIF9kb.20.02.1998 08:44скачать
NASCAR.GIF26kb.20.02.1998 17:12скачать
NEWS~182.GIF11kb.20.02.1998 08:41скачать
PROGRESS.GIF5kb.20.02.1998 08:38скачать
RULE02.GIF6kb.20.02.1998 08:38скачать
SABE~190.GIF30kb.20.02.1998 08:40скачать
SLIDBAR.GIF9kb.20.02.1998 08:36скачать
SPARK.GIF5kb.20.02.1998 08:33скачать
STAR~196.GIF14kb.20.02.1998 17:10скачать
WELLMESS.GIF12kb.20.02.1998 05:36скачать
WLCME.GIF8kb.20.02.1998 05:30скачать
YELLCAR.GIF28kb.20.02.1998 05:38скачать
BOOK2.GIF10kb.20.02.1998 18:57скачать
BOOK3.GIF20kb.20.02.1998 18:56скачать
ANIMASCT.GIF12kb.20.02.1998 11:32скачать
ANIRATZ.GIF4kb.20.02.1998 16:05скачать
ANMCALLE.GIF4kb.20.02.1998 11:32скачать
BUGSD~14.GIF68kb.20.02.1998 11:42скачать
CALVIN.GIF6kb.20.02.1998 11:28скачать
DEVIL~28.GIF8kb.20.02.1998 11:23скачать
DEVIL.GIF62kb.20.02.1998 11:30скачать
DRINK~30.GIF33kb.20.02.1998 11:22скачать
FOX.GIF18kb.20.02.1998 11:22скачать
FREAK~38.GIF3kb.20.02.1998 11:17скачать
GENIE.GIF67kb.20.02.1998 11:27скачать
GOLDHERO.GIF11kb.20.02.1998 11:15скачать
HERORUN.GIF57kb.20.02.1998 11:16скачать
OSCAR.GIF12kb.20.02.1998 10:59скачать
PNKPAN.GIF6kb.20.02.1998 10:58скачать
SHARPS.GIF99kb.20.02.1998 10:55скачать
SONIC.GIF5kb.20.02.1998 10:50скачать
SPIDE~54.GIF4kb.20.02.1998 10:50скачать
ST.GIF68kb.20.02.1998 10:56скачать
SUPER~58.GIF14kb.20.02.1998 10:49скачать
SYLVEST.GIF22kb.20.02.1998 10:49скачать
TWEETY.GIF9kb.20.02.1998 10:46скачать
VIKING.GIF38kb.20.02.1998 10:48скачать
WB.GIF16kb.20.02.1998 10:45скачать
WIZARD.GIF8kb.20.02.1998 10:43скачать
WOLF.GIF10kb.20.02.1998 10:43скачать
clownanim48.gif28kb.03.04.1998 17:05скачать
counting_fingers.gif4kb.11.10.1998 03:43скачать
3D.GIF20kb.20.02.1998 11:48скачать
COMETANI.GIF23kb.20.02.1998 11:49скачать
ORBIT.GIF57kb.20.02.1998 11:48скачать
WRING.GIF32kb.20.02.1998 11:37скачать
dancers.gif3kb.18.06.1998 21:05скачать
dansman.gif4kb.19.11.1998 02:53скачать
dtr10x.jpg35kb.18.03.1999 11:04скачать
dtr7.jpg25kb.07.11.1998 17:18скачать
ANI_EYE.GIF4kb.20.02.1998 12:00скачать
ANIMAL94.GIF22kb.20.02.1998 12:00скачать
EYE1.GIF17kb.20.02.1998 11:58скачать
EYE2.GIF41kb.20.02.1998 11:58скачать
EYE3.GIF19kb.20.02.1998 11:58скачать
EYE5.GIF17kb.20.02.1998 11:56скачать
EYE-LOOK.GIF3kb.20.02.1998 11:56скачать
EYE-MOV.GIF71kb.20.02.1998 12:00скачать
EYES2ANI.GIF30kb.20.02.1998 11:53скачать
EYES.GIF3kb.20.02.1998 11:54скачать
GP_PIC5.GIF134kb.20.02.1998 12:04скачать
GRN_E~40.GIF3kb.20.02.1998 11:50скачать
GRNEYES.GIF7kb.20.02.1998 11:49скачать
PEEP.GIF21kb.20.02.1998 13:12скачать
ANGEL.GIF54kb.20.02.1998 12:19скачать
ANKH.GIF8kb.20.02.1998 12:13скачать
DFLYGB.GIF28kb.25.02.1998 05:15скачать
DFLYGS.GIF28kb.25.02.1998 05:15скачать
DFLYSB.GIF19kb.25.02.1998 05:16скачать
DFLYS.GIF43kb.25.02.1998 05:16скачать
DRAGON~1.GIF12kb.20.02.1998 12:12скачать
DRAGON1.GIF41kb.20.02.1998 12:14скачать
DRAGON2.GIF18kb.20.02.1998 12:11скачать
HPS.GIF10kb.20.02.1998 12:10скачать
MONSTER.GIF11kb.20.02.1998 12:07скачать
PEGASUS2.GIF12kb.20.02.1998 12:05скачать
PEGASUS.GIF143kb.23.02.1998 20:26скачать
SORCE~44.GIF14kb.20.02.1998 12:05скачать
SPIRIT.GIF6kb.20.02.1998 12:05скачать
SWORD1.GIF51kb.20.02.1998 12:06скачать
SWORD.GIF23kb.20.02.1998 13:10скачать
SWORDS1.GIF23kb.20.02.1998 12:02скачать
UNUS_~58.GIF102kb.22.02.1998 02:34скачать
WIZARD1.GIF20kb.20.02.1998 13:08скачать
WRAITH.GIF24kb.20.02.1998 12:01скачать
ANI020.GIF22kb.20.02.1998 12:42скачать
BLUFIRE.GIF4kb.20.02.1998 12:42скачать
CANDLE1.GIF8kb.20.02.1998 12:41скачать
CANDLE2.GIF2kb.20.02.1998 12:41скачать
CANDLE3.GIF4kb.20.02.1998 12:40скачать
CANDLE6.GIF22kb.20.02.1998 12:48скачать
CANDLE7.GIF8kb.20.02.1998 12:45скачать
CANDLE.GIF10kb.20.02.1998 12:42скачать
DOOMFIRE.GIF13kb.20.02.1998 12:38скачать
DRKTORCH.GIF15kb.20.02.1998 13:10скачать
EXPLO~34.GIF19kb.20.02.1998 12:37скачать
FIRE001.GIF17kb.20.02.1998 12:35скачать
FIRE1.GIF7kb.20.02.1998 12:34скачать
FIRE2.GIF46kb.20.02.1998 12:36скачать
FIRE3.GIF6kb.20.02.1998 12:34скачать
FIREANM.GIF6kb.20.02.1998 12:33скачать
FIRELINK.GIF100kb.20.02.1998 12:41скачать
FIREW~54.GIF65kb.20.02.1998 13:09скачать
FIREW~56.GIF65kb.20.02.1998 12:33скачать
FIREW~58.GIF69kb.20.02.1998 12:33скачать
FIREWRKS.GIF37kb.20.02.1998 12:32скачать
FLAME1.GIF12kb.20.02.1998 13:07скачать
FLAME2.GIF4kb.20.02.1998 13:06скачать
FLAME3.GIF22kb.20.02.1998 13:07скачать
FLAME.GIF21kb.20.02.1998 12:30скачать
FLAMM~72.GIF7kb.20.02.1998 12:23скачать
FLIKER.GIF40kb.20.02.1998 13:07скачать
NUCLEAR.GIF34kb.20.02.1998 12:22скачать
RTORCH.GIF9kb.20.02.1998 12:19скачать
TORCH1.GIF16kb.20.02.1998 13:07скачать
TORCH.GIF12kb.20.02.1998 12:21скачать
TORCHSM.GIF16kb.20.02.1998 12:20скачать
ANIMDIAB.GIF26kb.20.02.1998 13:06скачать
BCROSS.GIF21kb.20.02.1998 13:06скачать
BLACK~10.GIF15kb.20.02.1998 13:05скачать
BONED~12.GIF23kb.20.02.1998 13:05скачать
BUTCHER.GIF15kb.20.02.1998 13:04скачать
CHESS.GIF23kb.20.02.1998 13:04скачать
DEDDI~20.GIF83kb.20.02.1998 12:49скачать
DIABL~24.GIF67kb.20.02.1998 13:03скачать
DIABL~26.GIF65kb.20.02.1998 13:12скачать
DIABL~28.GIF25kb.20.02.1998 13:02скачать
DIABL~30.GIF69kb.20.02.1998 13:06скачать
DNTIGER1.GIF16kb.20.02.1998 13:00скачать
DOOM2.GIF5kb.20.02.1998 13:00скачать
DRUIDD.GIF67kb.20.02.1998 13:03скачать
EXPLO~42.GIF26kb.20.02.1998 12:59скачать
FIGHTER.GIF8kb.20.02.1998 12:58скачать
GANGS.GIF47kb.25.02.1999 17:37скачать
INCIN~48.GIF21kb.20.02.1998 16:07скачать
INVIS~50.GIF12kb.20.02.1998 12:58скачать
KNIGHT.GIF35kb.20.02.1998 13:05скачать
LAZARUS.GIF21kb.20.02.1998 13:00скачать
LORDS~56.GIF25kb.20.02.1998 12:58скачать
MAGEAT.GIF19kb.20.02.1998 12:53скачать
MAGE.GIF30kb.20.02.1998 12:53скачать
MAGICIAN.GIF50kb.20.02.1998 13:02скачать
PEN.GIF27kb.20.02.1998 12:52скачать
PENTA~68.GIF3kb.20.02.1998 12:51скачать
PENTA~70.GIF11kb.20.02.1998 12:51скачать
QUAKE.GIF13kb.20.02.1998 12:51скачать
RAD.GIF10kb.20.02.1998 12:51скачать
ROGUEBOW.GIF12kb.20.02.1998 12:51скачать
SCORPIO.GIF14kb.20.02.1998 12:51скачать
SKULL~84.GIF5kb.20.02.1998 12:50скачать
SKULL~86.GIF9kb.20.02.1998 12:50скачать
SORCERF.GIF19kb.20.02.1998 12:50скачать
SUB-ZERO.GIF13kb.20.02.1998 12:52скачать
SUCCUBUS.GIF14kb.20.02.1998 12:50скачать
UNRAV~96.GIF9kb.20.02.1998 12:50скачать
UO.GIF13kb.20.02.1998 12:50скачать
WARRIORA.GIF17kb.20.02.1998 12:50скачать
WARRIORB.GIF19kb.20.02.1998 12:49скачать
WARRIOR.GIF19kb.20.02.1998 12:49скачать
HAND1.GIF37kb.20.02.1998 12:46скачать
HAND3.GIF55kb.20.02.1998 12:47скачать
HAND.GIF23kb.20.02.1998 12:46скачать
HANDS.GIF24kb.20.02.1998 12:45скачать
HANDWAVE.GIF17kb.20.02.1998 12:45скачать
HEART2.GIF10kb.20.02.1998 18:55скачать
ABELLL~6.GIF25kb.23.02.1998 04:29скачать
ABELLR~8.GIF24kb.23.02.1998 04:39скачать
XMASLT2.GIF21kb.23.02.1998 02:42скачать
hoparlor.gif10kb.02.04.1998 15:11скачать
hot_mix.gif20kb.09.06.1998 14:04скачать
line13.gif15kb.18.04.1998 02:16скачать
mailmove.gif7kb.18.05.1998 02:36скачать
1P_LVER1.GIF61kb.24.02.1998 19:22скачать
ALARMCL.GIF8kb.24.02.1998 19:20скачать
ANADIM.GIF29kb.24.02.1998 19:21скачать
ART.GIF33kb.24.02.1998 19:19скачать
ASTER.GIF13kb.24.02.1998 19:19скачать
BLOB.GIF5kb.24.02.1998 19:04скачать
BRUSH.GIF30kb.24.02.1998 19:04скачать
C_FAN.GIF13kb.24.02.1998 19:03скачать
CLAP.GIF49kb.24.02.1998 19:03скачать
$.GIF30kb.24.02.1998 19:22скачать
GUNANIM.GIF9kb.24.02.1998 18:51скачать
LLRINGS.GIF31kb.25.02.1998 05:16скачать
LOOKER1.GIF2kb.25.02.1998 05:16скачать
M14.GIF9kb.25.02.1998 05:16скачать
PLAYBOY.GIF9kb.24.02.1998 00:38скачать
RCHAIR.GIF30kb.24.02.1998 00:37скачать
REDRINGS.GIF37kb.24.02.1998 00:36скачать
RFHEA~40.GIF19kb.24.02.1998 00:37скачать
RING_ANM.GIF9kb.24.02.1998 00:36скачать
ROSE01.GIF22kb.24.02.1998 00:35скачать
STARR.GIF138kb.24.02.1998 00:32скачать
MOV11.GIF5kb.03.04.1998 17:10скачать
mp3cd.gif30kb.20.11.1998 05:07скачать
newSmCLR.gif2kb.18.06.1998 21:07скачать
PERL.GIF32kb.02.04.1998 15:20скачать
pulsar1.gif12kb.17.01.1998 21:25скачать
ATOM1.GIF7kb.24.02.1998 21:00скачать
ATOM2.GIF37kb.24.02.1998 21:00скачать
ATOM3.GIF25kb.24.02.1998 21:00скачать
NUC_AN3.GIF12kb.24.02.1998 20:59скачать
SPIKES.GIF15kb.24.02.1998 20:59скачать
DANCIN~8.GIF34kb.24.02.1998 20:54скачать
SKELE~14.GIF7kb.24.02.1998 20:52скачать
SKELE~16.GIF66kb.24.02.1998 20:52скачать
SKELEDAN.GIF22kb.24.02.1998 20:53скачать
SKELETON.GIF70kb.24.02.1998 20:54скачать
SKULL1.GIF40kb.24.02.1998 20:52скачать
SKULL2.GIF31kb.24.02.1998 20:52скачать
SKULL33.GIF4kb.24.02.1998 20:49скачать
SKULL3.GIF13kb.24.02.1998 20:50скачать
SKULL.GIF46kb.24.02.1998 20:51скачать
Smile.gif2kb.03.04.1998 17:10скачать
SMILELY.GIF1kb.03.04.1998 17:10скачать
ABDUCT~6.GIF33kb.24.02.1998 20:50скачать
ALIEN1.GIF14kb.24.02.1998 20:49скачать
ALIEN2.GIF17kb.24.02.1998 20:49скачать
ALIENBAL.GIF33kb.24.02.1998 20:49скачать
AL_IEN.GIF6kb.24.02.1998 20:49скачать
ALIEN.GIF15kb.24.02.1998 20:49скачать
ALION.GIF5kb.24.02.1998 20:47скачать
BORGSHIP.GIF121kb.24.02.1998 20:48скачать
COOL_D1.GIF15kb.24.02.1998 20:47скачать
FLASH.GIF5kb.24.02.1998 20:46скачать
FLYIN~30.GIF6kb.24.02.1998 20:46скачать
GBOWL.GIF22kb.24.02.1998 20:46скачать
KLINGON.GIF33kb.24.02.1998 20:45скачать
LIGHTMAN.GIF126kb.24.02.1998 20:47скачать
MECH10.GIF35kb.24.02.1998 20:40скачать
MECH1.GIF7kb.24.02.1998 20:43скачать
MECH2.GIF54kb.24.02.1998 20:45скачать
MECH3.GIF56kb.24.02.1998 20:43скачать
MECH4.GIF55kb.24.02.1998 20:43скачать
MECH5.GIF37kb.24.02.1998 20:41скачать
MECH6.GIF53kb.24.02.1998 20:42скачать
MECH7.GIF62kb.24.02.1998 20:41скачать
MECH8.GIF60kb.24.02.1998 20:41скачать
MECH9.GIF15kb.24.02.1998 20:39скачать
NXTGEN.GIF53kb.24.02.1998 20:38скачать
R2D2.GIF146kb.24.02.1998 20:39скачать
REDSHIP.GIF95kb.24.02.1998 20:37скачать
SHIPANI.GIF39kb.24.02.1998 20:34скачать
SHIP.GIF96kb.24.02.1998 20:36скачать
SPACE~84.GIF27kb.24.02.1998 20:29скачать
SPACE~90.GIF76kb.24.02.1998 20:31скачать
SPACE~92.GIF46kb.24.02.1998 20:27скачать
SPACE.GIF111kb.24.02.1998 20:34скачать
SPSHIP10.GIF10kb.24.02.1998 20:16скачать
SPSHIP12.GIF44kb.24.02.1998 19:44скачать
SPSHIP1.GIF28kb.24.02.1998 20:24скачать
SPSHIP2.GIF104kb.24.02.1998 20:24скачать
SPSHIP3.GIF18kb.24.02.1998 20:22скачать
SPSHIP4.GIF67kb.24.02.1998 20:22скачать
SPSHIP6.GIF36kb.24.02.1998 20:21скачать
SPSHIP7.GIF36kb.24.02.1998 20:20скачать
SPSHIP8.GIF114kb.24.02.1998 20:21скачать
SPSHIP9.GIF42kb.24.02.1998 20:18скачать
SPSHIP.GIF84kb.24.02.1998 20:26скачать
STARBADG.GIF14kb.24.02.1998 19:43скачать
STARWARS.GIF102kb.24.02.1998 19:42скачать
TIEF~130.GIF74kb.24.02.1998 19:42скачать
TREK.GIF21kb.24.02.1998 19:39скачать
VOYBAR2.GIF17kb.24.02.1998 19:38скачать
WINK~142.GIF19kb.24.02.1998 19:38скачать
XWINGS.GIF25kb.24.02.1998 19:38скачать
Spicker.gif6kb.03.11.1998 16:03скачать
thatsall200.gif21kb.13.12.1998 12:43скачать
CAMERA1.GIF108kb.25.02.1998 05:13скачать
XFILES.GIF25kb.25.02.1998 05:09скачать
under5.gif6kb.13.04.1998 00:28скачать
LIGHT~14.GIF37kb.25.02.1998 05:13скачать
LIGHT~18.GIF42kb.25.02.1998 05:13скачать
TWISTER2.GIF13kb.25.02.1998 05:09скачать
задание СПС лаб6.doc27kb.20.04.2005 11:14скачать
1. РАЗРАБОТКА СПРАВОЧНЫХ HTML-СИСТЕМ.DOC103kb.24.02.2001 09:44скачать
2. ОБЗОР СИСТЕМЫ HTML HELP.DOC95kb.24.02.2001 07:47скачать
3. Работа с HTML Work Shop.doc225kb.28.03.2005 11:56скачать
4. ИНФОРМАЦИОННЫЕ МАТЕРИАЛЫ HTML И ФАЙЛ ПРОЕКТА.DOC54kb.23.02.2001 11:07скачать
5. MICROSOFT HTML HELP.DOC263kb.24.02.2001 10:04скачать
Как организовать вызов дополнительного окна на гиперссылку.doc30kb.23.03.2005 22:33скачать
Добавление закладки ПОИСК в HTML-HELP.doc56kb.23.03.2005 23:01скачать
Создание Pop-Up окна в HTML-HELP файлах.doc53kb.21.03.2005 23:51скачать
Встраивание сценариев в HTML.doc27kb.28.03.2005 20:46скачать
Прочие элементы.doc26kb.27.03.2005 20:23скачать
Словарь по HTML для начинающих.doc43kb.28.03.2005 15:06скачать
Таблица цветов RGB и HTML.doc232kb.28.03.2005 15:15скачать
1. Добавление Flash к Html-Help.doc43kb.27.03.2005 18:59скачать
2. Подключение Flash к html.doc41kb.26.03.2005 10:27скачать
3. Атрибуты тэгов OBJECT и EMBED.doc76kb.26.03.2005 01:00скачать
Hh_C++.pdf77kb.12.02.2001 06:56скачать
Hh_VB.pdf60kb.12.02.2001 06:56скачать
1. ИСПОЛЬЗОВАНИЕ HTML HELP В ПРИЛОЖЕНИЯХ НА VISUAL BASIC.DOC123kb.24.05.2005 19:31скачать
2. Добавление HTML Help в приложение VB 6.0.doc28kb.02.04.2010 11:57скачать
3. Как вызывать help из приложения С++.doc48kb.06.03.2005 10:05скачать
4. Использование HTML Help в проекте MFC.doc29kb.17.03.2005 14:52скачать
Теги HTML.doc1691kb.31.03.2006 14:36скачать
01. Все, что нужно знать о программировании в Macromedia Flash.doc178kb.04.05.2005 14:38скачать
02. СПРАВОЧНИК по программированию во FLASH.doc407kb.04.05.2005 14:37скачать
03. ОБЪЕКТНО ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕ в ACTION SCRIPT.doc605kb.03.05.2005 17:24скачать
04. Программирование клиентских приложений с использованием Macromedia Flash.doc133kb.28.03.2005 19:09скачать
05. ЯЗЫК ACTION SCRIPT.doc2998kb.20.04.2005 10:27скачать
06. ActionScript - во Flash.doc104kb.30.03.2005 11:08скачать
07. Отладка во Flash 5.doc124kb.01.03.2004 11:23скачать
08. Обнаружение ошибок в именах переменных Actionscript.doc26kb.26.11.2003 10:45скачать
09. Создание элементов сайтов с использованием Flash.doc133kb.28.03.2005 19:20скачать
10. Программное создание часов во Flash.doc76kb.28.03.2005 19:24скачать
11. Программирование во Flash.doc54kb.01.03.2004 10:54скачать
12. Стандарты Actionscript.doc218kb.26.03.2005 01:07скачать

05. ЯЗЫК ACTION SCRIPT.doc

1   2   3   4   5   6   7   8   9   ...   82
Реклама MarketGid:
Загрузка...
^

Глава 12. Объекты и классы

Содержание:


Анатомия объекта
Создание экземпляров объектов
Свойства объектов
Методы объектов
Классы и объектно-ориентированное программирование
Классы и объекты встроенные в ActionScript
Вперед!

В этой главе рассказывается о так называемом объектно-ориентированном программирование (ООП), которое для многих читателей является неизведанной областью. Мы немного расскажем об используемой в нем технологии и приведем для большей конкретности несколько практических примеров. Возможно, вы слышали о таинственности ООП и о трудности его понимания. На самом деле, идеи ООП весьма интуитивны, и процесс ООП значительно легче, чем вас пытались убедить. По сути, ООП просто означает, что некоторые части программы рассматриваются как независимые объекты. Эту идею легко уловить, если понять, что все, с чем мы имеем дело в реальном мире, является независимыми объектами. Ваша собака, родители, машина, компьютер - все это независимые объекты. Имеется в виду, что некоторые вещи они выполняют независимо, а другие - по вашей просьбе, даже если вам не известен внутренний механизм их работы.

Не нужно быть биологом, чтобы заставить вашу собаку принести палку. Не нужно быть механиком, чтобы вести машину. Не нужно быть психоаналитиком, чтобы общаться с родителями, и, вопреки слухам, не нужно быть специалистом по вычислительной технике, чтобы отправлять и получать электронную почту. Все, что требуется знать, это команды, которым готов подчиняться объект (называемые методами), и результаты выполнения этих команд. Например, если нажать на педаль газа, можно предположить, что машина увеличит скорость. Если вы дадите вашей собаке команду "сидеть!", то можете предполагать, что она сядет. Вооружившись такими житейскими представлениями об объектах реального мира, посмотрим, какую связь имеют эти представления с ActionScript.

Классическим примером программного объекта служит прыгающий мячик (ball). Как и у настоящего мячика, у объекта ball могут иметься свойства, соответствующие его атрибутам, такие как радиус, цвет, масса, местонахождение и прыгучесть (упругость). Для представления прыгающего мячика в программе создадим объект ball со свойствами radius и прочими. Свойства объекта отображают его состояние в любой заданный момент, и некоторые из них со временем меняются. Например, чтобы заставить мячик двигаться, нужно смоделировать законы движения Ньютона. Это означает, что необходимо на языке компьютера описать перемещение мячика с течением времени. В простейшем случае, вспомнив, что скорость, помноженная на время, равна расстоянию, можно определить будущее положение мячика по горизонтали с помощью такого псевдоуравнения:

ball.xPosition += ball.xVelocity * (elapsedTime)

Это уравнение начинается с текущего положения мячика и добавляет пройденное расстояние (исходя из его скорости и прошедшего времени), чтобы получить новое положение. Поведением (behavior) объекта называют просто правила, по которым он управляется, вроде нашего уравнения для расчета положения мячика в зависимости от времени. Обычно для такого поведения создаются оболочки в виде так называемых методов, которые просто являются функциями, реализующими поведение объекта. Например, можно создать метод move( ), реализующий предыдущее уравнение.

Таким образом, методы можно рассматривать как команды, которым подчиняется объект. Конечно, у объекта может быть несколько методов. Допустим, нужно заставить мячик отскакивать. Можно создать метод bounce( ), который меняет направление движения мячика на противоположное и уменьшает его скорость (мячик ведь не является абсолютно упругим). Метод bounce( ) может реализовать такое уравнение:

ball.xVelocity = -(ball.xVelocity) * 0.95 // Упругость мячика 95%

Прежде чем проникнуть в тайны создания объектов, добавления свойств и реализации методов, формализуем некоторые из определений. Объект формально является структурой данных, объединяющей связанные между собой свойства и методы (они же функции). Обычно объект инкапсулирует свое поведение: это означает, что внутренние подробности выполнения им своих функций могут быть не видны снаружи объекта. Вместо этого программа взаимодействует с объектом по средством так называемых интерфейсов (т.е. методов, доступ к которым открыт вне объекта). Другим частям программы обычно нечего волноваться по поводу того, каким образом объект делает то, что он делает: программа просто поставляет объекту входные данные и проверяет выходные (результаты), если нужно. Вы также услышите о классах (classes) и экземплярах (instances). Класс является родовой категорией объектов, а экземпляр является просто конкретным случаем (т.е. экземпляром) объекта. Например, ваша конкретная домашняя собака является экземпляром общего класса Dog. Все собаки класса Dog лают, и у них по четыре лапы, но у вашей конкретной собаки собственные значения свойств роста, веса и массы, используемых для описания собак.

Объектно-ориентированное программирование (ООП) - это всего лишь название для программ, которые используют объекты. Объекты и ООП настолько присущи ActionScript, что мы уже пользовались ими, возможно, не осознавая этого. Знакомым объектом Flash является мувиклип (Movie Clip), реализованный как совокупность свойств и методов. Когда мы определяем высоту мувиклипа с помощью my_mc._height, то обращаемся к свойству _height объекта мувиклип. А когда мы воспроизводим мувиклип с помощью my_mc.play( ), то вызываем метод play( ) этого объекта.

СОВЕТ


Обычно все экземпляры класса объектов пользуются общими именами методов и свойств, а один экземпляр класса отличается от другого значениями этих свойств.

Не зависимо от того, какие объекты используются - собственные или встроенные в ActionScript, ООП четко отделяет компоненты программы один от другого (инкапсулирует ) и позволяет им взаимодействовать между собой, не зная подробностей устройства друг друга. Это позволяет изменять внутреннее функционирование объекта без отрицательного воздействия на те части программы, которые используют объект, если только не меняются методы объекта (т.е. его интерфейсы на внешний мир). Если вернуться, например, к нашему объекту ball, нас не интересует то, что законы физики изменяют характер движения нашего мячика. Мы лишь вызываем метод move( ), а о деталях пусть заботится сам объект.

Другой приятной особенностью ООП является возможность обращаться с разными объектами, обладающими разным поведением, единообразно, если в них реализованы методы с одинаковыми именами. Например, есть объект circle (круг) и square (квадрат). Если в обоих объектах реализован метод area( ), возвращающий площадь фигуры, то можно вызывать их методы area( ), не беспокоясь о том, как каждый из объектов вычисляет свою площадь.

В этой главе мы научимся создавать базовые объекты и определять категории объектов (т.е. классы). Освоив основы, мы узнаем, как использовать в классах и объектах общие характеристики (т.е. создавать родословное дерево) с помощью наследования. Например, можно реализовать класс Horse (лошадь), который наряду с классом Dog (собака) является потомком класса Mammal (млекопитающие). В классе Mammal можно реализовать методы и свойства, общие для всех млекопитающих, например, наличие шерсти, способность давать молоко и теплокровность. Наконец, мы узнаем, как с помощью ООП управлять средой Flash посредством встроенных объектов и классов ActionScript.

Надеюсь, что это введение пролило некоторый свет на объекты и ООП. Займемся глубже спецификой.
^

12.1. Анатомия объекта


Как и массив, отдельный объект служит контейнером для контейнеров. Массив содержит несколько значений данных в отдельных элементах; аналогично этому, объект содержит несколько значений данных в отдельных свойствах. Однако свойства объекта именуются, а не нумеруются. Массив хранит группу элементов в нумерованном списке, а объект хранит свойства в соответствии с уникальными идентификаторами, которые никак не упорядочены. Для доступа к элементу массива нужно знать номер его позиции, а для доступа к свойству объекта требуется знать его имя (т.е. идентификатор).

На рис. 12-1 изображены свойства примера объекта с именем ball. У объекта ball есть два свойства: radius (радиус) и color (цвет). Значениями этих свойств являются соответственно 50 и 0xFF0000 (шестнадцатеричное значение красного цвета). Свойства названы уникальными идентификаторами, как переменные. Хотя у каждого свойства есть собственное имя, все они хранятся в едином охватывающем их объекте, ball.


^

Рис. 12-1. Пример структуры объекта


Очевидно, что объект обычно определяет свойства, которые связаны с ним по смыслу. Более конкретно, свойства объекта нужно выбирать так, чтобы с их помощью можно было отличить один объект от другого. Объекты мувиклип, к примеру, обладают специфическими для мувиклипов свойствами, такими как количество кадров в них (_totalframes) и их расположение (_x и _ y).

Так как свойства объектов именуются, а не нумеруются, для объектов не существует таких средств управления элементами, какие есть в массивах (shift( ), unshift( ), push( ), splice( ) и т.д.). Свойства объектов принято задавать с помощью методов объекта, чтобы не нарушать его инкапсуляции. Это означает, что в строгом ООП объект должен устанавливать свои собственные свойства. Если внешняя сущность хочет задать свойство объекта, это должно быть сделано путем вызова соответствующего метода объекта. Например, пуристу (борцу за чистоту языка) не понравилось бы непосредственное присваивание значения свойству массива length. Он стал бы доказывать, что лучше всего дать объекту Array возможность самому задавать свойство length, а код, находящийся вне объекта, должен делать это только косвенно путем вызова одного из методов объекта Array. В этом случае тот, кто сопровождает класс Array, может поменять имя свойства length на len, что никак не отразится на других пользователях.
^

12.2. Создание экземпляров объектов


Пусть это покажется откатом назад, но допустим, что класс объектов уже создан. Это не слишком нелепое предположение, т.к. ActionScript предоставляет много встроенных классов, и пользовательские классы, которые мы будем создавать, будут вести себя аналогично им. Предположив, что класс объектов уже есть, мы должны создать конкретный экземпляр объекта на базе этого класса. Например, ActionScript предоставляет класс объектов Array, на создание конкретных массивов предоставляется пользователю.

Для создания экземпляра объекта используется оператор new и функция конструктор (constructor function), с помощью которой инициализируется объект. Общий синтаксис при этом следующий:

new ConstructorFunction( )

Создадим экземпляр нашего первого объекта с помощью конструктора, который уже встроен в ActionScript - конструктора Object( ). Конструктор Object( ) создает самый общий объект (поэтому он так и назван), базовый тип объекта для всех других типов объектов. Приведенный ниже код создает новый родовой объект:

new Object( )

При создании экземпляра объекта полученный экземпляр обычно сохраняется в переменной, элементе массива или свойстве объекта, чтобы в дальнейшем к нему можно было обращаться. Например:

var myObject = new Object( );

При создании объекта таким способом получается пустой объект без свойств и только с двумя самыми общими методами. Следовательно, родовые объекты имеют ограниченную область применения: действительная мощь объектов появляется тогда, когда создаются специализированные классы объектов. Прежде чем научиться создавать собственные классы, посмотрим, как использовать свойства и методы объектов существующих классов.
^

12.3. Свойства объектов


Свойства являются именованными контейнерами данных, связанными с объектом. Они определяются классом объекта и задаются индивидуально для каждого экземпляра объекта. Как и переменные, свойства объектов могут содержать данные любого типа: строки (Strings), числа (Numbers), булевы величины (Booleans), null, undefined, функции (Functions), массивы (Arrays), мувиклипы (Movie Clips) и даже другие объекты (Objects).
^

12.3.1. Обращение к свойствам объектов


Доступ к свойствам объекта предоставляет знакомый нам уже оператор точки. Точка отделяет имя свойства от объекта, которому оно принадлежит, например:

objectName.propertyName

где objectName является именем объекта, а propertyName - допустимый идентификатор, соответствующий имени некоторого свойства objectName.

Например, если есть экземпляр объекта ball со свойством radius, обратится к свойству radius можно таким образом:

ball.radius

В альтернативном способе обращения к свойству применяется оператор "квадратные скобки" [ ] , например:

objectName[propertyName]

Оператор [ ] позволяет образовать имя свойства с помощью любого выражения, значением которого является строка. Например:

trace(ball["radius"]);


var prop = "radius";

trace(ball[prop]); // prop разрешается в "radius"

Доступ ко встроенным свойствам ActionScript осуществляется точно таким же способом. Вспомните синтаксис получения значения числа "пи":

Math.PI

В этом выражении происходит обращение к встроенному свойству PI объекта Math. Однако в чистом ООП почти никогда к свойству объекта не обращаются напрямую, вместо этого используют методы. Например, для получения свойства volume экземпляра встроенного класса Sound, пишут:

trace(mySound.getVolume( ));

а не:

trace(mySound.volume);
^

12.3.2. Использование цикла for-in для доступа к свойствам объекта


В главе 8 "Предложения цикла" было показано, как цикл for-in может использоваться для перечисления свойств объекта. Сейчас, когда об объектах стало известно несколько больше, стоит на некоторое время вернуться к предложению for-in и снова рассмотреть его использование для работы со свойствами объекта.

Подобно всем циклам, предложение for-in состоит из заголовка и тела. Тело предложения for-in автоматически выполняется один раз для каждого свойства указанного объекта. Не нужно знать количество свойств или их имена, поскольку при каждой итерации цикла переменная "итератора" автоматически становится равной имени очередного свойства. Поэтому можно обращаться к свойствам объекта так:

// Перечислить все свойства объекта ball

for (var prop in ball) {

trace("Свойство " + prop + " имеет значение " + ball[prop]);

}

Обратите внимание, что переменная итератора prop в этом примере не является целым числом, каким она была бы в цикле for. Поэтому не путайте стандартный цикл for, обычно используемый для доступа к нумерованным элементам массива, с циклом for-in, используемым для доступа к свойствам объекта. Сведения о циклах for-in можно найти в главе 8 "Предложения цикла".
^

12.4. Методы объектов


Методы - это функции, связанные с объектом и обычно используемые для выполнения задач или доступа к данным объекта. Методы вызываются с помощью оператора вызова функций, ( ), при этом имя метода отделяется от имени его объекта с помощью оператора точки:

objectName.methodName( )

Например:

ball.getArea( ); // Вызвать метод getArea( ) объекта ball

Как и свойства, методы определяются для класса и вызываются для отдельных экземпляров объектов. Однако, прежде чем рассмотреть создание методов в классе, подчинимся правилам хорошего ООП и прикрепим метод к отдельному экземпляру встроенного класса Object. Поняв, как один метод действует с изолированным объектом, мы правильно применим идею к собственному классу.

Метод, в сущности, является функцией, хранимой в свойстве объекта. В результате присваивания функции свойству объекта она становится методом этого объекта:

// Создать объект

myObject = new Object( );


// Создать функцию

function greet ( ) {

trace("hello world");

}


// Теперь присвоить значение функции greet свойству sayHello

myObject.sayHello = greet;

Когда функция помещена в свойство объекта, можно вызывать ее как метод. Например:

myObject.sayHello( ); // Выводит: "hello world"

По правде говоря, можно присвоить функцию и элементу массива (а не свойству объекта) и вызывать ее с помощью оператора вызова, вот так:

var myList = new Array( );

myList[0] = greet;

myList[0]( ); // Выводит: "hello world"

Но когда функция вызывается в качестве метода объекта, с ней происходит нечто особенное: она обретает способность извлекать или задавать свойства объекта, к которому прикреплена. Посмотрим, как это действует с нашим свойством sayHello. Во-первых, добавим свойство msg к нашему родовому объекту (и снова в показательных целях мы повинуемся правилам ООП... Считается дурным тоном прикреплять свое свойство к отдельному экземпляру объекта):

myObject.msg = "Nice day, isn't it?";

Теперь подправим greet( ), чтобы выводилось значение msg:

function greet ( ) {

trace(this.msg);

}


// Теперь снова вызовем sayHello

myObject.sayHello( ); // Выводит: "Nice day, isn't it?"

Обратили ли вы внимание на ключевое слово this в конце второй строки? Оно соединяет нас с объектом myObject. При выполнении sayHello( ) в качестве метода объекта myObject, в этот метод фактически передается невидимый аргумент с именем this, который содержит ссылку на myObject. В теле функции this используется для доступа к свойству msg объекта myObject в виде this.msg. При вызове myObject.sayHello( ) выражение this.msg разрешается в myObject.msg и становится: "Nice day, isn't it?".

Методы могут как извлекать, так и задавать значения свойств содержащего их объекта. ^ В примере 12-1 показан метод, который извлекает значения двух свойств объекта, выполняет над ними вычисления, а затем задает значение нового третьего свойства. (И снова, поскольку в центре нашего внимания находятся методы, используемый нами объект является всего лишь экземпляром объекта. В следующем разделе мы узнаем, как правильно добавлять новые методы объектов через класс.)
^

Пример 12-1. Реализация метода, задающего свойство


// Создать новый объект и сохранить его в переменной rectangle

var rectangle = new Object( );

rectangle.width = 10;

rectangle.height = 5;


// Определить функцию для вычисления площади прямоугольника и задать соответствующее свойство

// Обратите внимание на использование ключевого слова this.

function rectArea( ) {

this.area = this.width * this.height;

}


// Назначить функцию методом объекта rectangle

rectangle.setArea = rectArea;


// Теперь вызвать метод setArea( ) объекта rectangle

rectangle.setArea( ); // Присваивает площади прямоугольника значение 50


// Наконец, посмотрим, какое новое свойство создал setArea( )

trace(rectangle.area); // Выводит: 50

Чаще метод не задает, а возвращает значение свойства. Переделаем метод setArea( ) объекта rectangle, как показано в примере 12-2.
^

Пример 12-2. Возвращение методом значения


// Создать и настроить прямоугольник. Обратите внимание на недоступность

// присваивания метода area до появления в коде функции rectArea.

var rectangle = new Object( );

rectangle.width = 10;

rectangle.height = 5;

rectangle.area = rectArea;


// На этот раз просто возвратим площадь, не присваивая ее свойству

function rectArea( ) {

return this.width * this.height;

}


// Теперь ее даже проще использовать

trace("Площадь прямоугольника равна " + rectangle.area( ));


// Выводит: "Площадь прямоугольника равна 50"

Ключевое слово this - хитрая вещь, поскольку требует от интерпретатора некоторой "ловкости рук". Чтобы проиллюстрировать, как работает предыдущий код из примера 12-3, рассмотрим пример 12-3, выявляющий скрытую связь между this и его объектом и методом. (Пример 12-3 вымышлен, так как this является ключевым словом и при использовании в таком виде вызовет ошибку.)
^

Пример 12-3. Фиктивный пример, явным образом использующий this


// Создать и настроить объект rectangle

var rectangle = new Object( );

rectangle.width = 10;

rectangle.height = 5;

rectangle.area = rectArea;


// Специально потребуем this в качестве параметра функции rectArea( )

function rectArea(this) {

return this.width * this.height;

}


// Вызов метода с явной ссылкой на объект rectangle

trace("Площадь прямоугольника равна " + rectangle.area(rectangle));

Методы могут также присваиваться свойствам объектов в виде литералов функций. Использование литерала функции для создания метода избавляет от необходимости сначала задавать функцию, а затем присваивать ее свойству. В примере 12-4 объект примера 12-2 переработан так, чтобы показать использование литерала функции.
^

Пример 12-4. Реализация методов с помощью литералов функций


var rectangle = new Object( );

rectangle.width = 10;

rectangle.height = 5;


// Здесь идет присваивание литерала функции

rectangle.area = function ( ) {

return this.width * this.height;

}; // Рекомендуется использовать ";" в конце литерала


// Вызвать функцию можно, как и прежде

trace("Площадь прямоугольника равна " + rectangle.area( ));

Методы предоставляют огромные возможности для контроля над объектами. Использование методов со встроенными объектами является одним из главных средств управления средой Flash-роликов.

В этом разделе мы познакомились с тем, как записать функцию в свойство (тем самым сделав ее методом) и как вызывать функцию с помощью свойства. У этих двух действий схожий синтаксис, но совершенно разные результаты. Очень важно помнить различия между ними.

СОВЕТ


Во время присваивания метода свойству круглые скобки должны быть опущены:

myObj.myMethod = someFunction;

При вызове метода круглые скобки должны присутствовать:

myObj.myMethod( );

Различие в синтаксисе очень тонкое, так что следите за его соблюдением.
^

12.5. Классы и объектно-ориентированное программирование


Не так уж редко приходится создавать десятки сложных объектов, хранящих массу информации обо всем: от товаров в системе электронного магазина до нехороших субъектов, обладающих искусственным интеллектом, в видеоигре. Для облегчения создания объектов и задания иерархий объектов (отношения между объектами) используются классы (classes) объектов. Класс служит определением в виде шаблона для целой категории объектов. Как говорилось в ведении, классы описывают родовые особенности определенных типов объектов, таких как "у всех собак по четыре лапы".
^

12.5.1. Классы объектов


Прежде чем рассматривать, как используются классы, посмотрим, как обстоят дела, если их не использовать. Допустим, нужен объект ball, но вместо того чтобы создавать его с помощью класса, мы просто попробуем приспособить для этого общий объект из встроенного класса Object. Дадим этому объекту свойства: radius, color, xPosition и yPosition. Затем добавим два метода: moveTo( ) и area( ) - для перемещения объекта и определения размера занимаемой им площади.

Воспользуемся таким кодом:

var ball = new Object( );

ball.radius = 10;

ball.color = 0xFF0000;

ball.xPosition = 59;

ball.yPosition = 15;

ball.moveTo = function (x, y) { this.xPosition = x; this.yPosition = y; };

ball.area = function ( ) { return Math.PI * (this.radius * this.radius); };

Такой подход приводит к нужной цели, но имеет и ограничения: каждый раз, когда требуется новый объект ball, приходится повторять весь код инициализации для этого объекта, что является утомительным и чревато ошибками. Кроме того, при создании таким способом многочисленных объектов ball будет происходить избыточное дублирование одинакового кода функций moveTo( ) и area( ) для каждого объекта, что приведет к ненужному расходу памяти.

Для эффективного создания ряда объектов с общими свойствами следует создать класс. С помощью класса можно определить свойства, которыми должны обладать все объекты ball. Кроме того, все свойства с фиксированными значениями можно сделать общими для всех экземпляров класса ball. На обычном языке класс Ball можно описать интерпретатору так:

Ball является типом объекта. У всех экземпляров объекта ball есть свойства: radius, color, xPosition и yPosition, которые задаются отдельно для каждого ball. Все объекты ball также используют совместно методы moveTo( ) и area( ), одинаковые для всех членов класса Ball.

Посмотрим, как эта теория действует на практике.
^

12.5.2. Создание класса


В ActionScript не существует специального средства для "объявления класса": нет предложения "class", которое создавало бы новый класс подобно предложению var, которое создает новые переменные. Вместо этого определяется особый тип функции, называемой конструктором (constructor), которая генерирует новые экземпляры класса. В результате определения функции конструктора фактически создается шаблон класса, или его определение.

Синтаксически функции конструкторов (или просто конструкторы) имеют вид обычных функций. Например:

function Constructor ( ) {

предложения

}

Именем функции конструктора класса может быть любое допустимое имя функции, но для обозначения того, что это конструктор класса, принято писать его с заглавной буквы. Имя конструктора должно описывать класс создаваемых им объектов, например Ball, Product или Vector2d. Содержащиеся в конструкторе предложения инициализируют создаваемые им объекты.

Для начала сделаем функцию конструктора Ball как можно более простой. Пока нам нужно только чтобы она создавала пустые объекты:

// Сделать Ball конструктором

function Ball ( ) {

предложения // Здесь что-то выполняется

}

Это было не трудно. Теперь посмотрим, как с помощью функции конструктора Ball создавать объекты ball.
^

12.5.2.1. Создание членов класса


Функция конструктор определяет класс и используется для создания новых экземпляров класса. Как отмечалось выше, при вызове с оператором new функция конструктора создает, а затем возвращает экземпляр объекта. Вспомним общий синтаксис создания нового объекта с помощью функции конструктора:

new Constructor( ); // Возвращает экземпляр класса Constructor

Поэтому для создания объекта ball (экземпляра) с помощью класс Ball пишут:

myBall = new Ball( ); // Сохраняет экземпляр класса Ball в myBall

Класс Ball пока не добавляет свойств и методов к создаваемым им объектам. Этим мы сейчас и займемся.
^

12.5.2.2. Присвоение новых свойств объектам класса


Для создания новых свойств на этапе создания объекта снова обратимся к специальному ключевому слову this. Внутри функции конструктора в ключевом слове this хранится ссылка на создаваемый в данный момент объект. С помощью этой ссылки можно присваивать зарождающемуся объекту любые нужные свойства. Общая технология этого описывается следующим синтаксисом:

function Constructor ( ) {

this.propertyName = value;

}

Здесь this указывает на создаваемый объект, propertyName является свойством, а value является значением данных, которое присваивается этому свойству.

Применим эту технику в нашем примере с Ball. Ранее предлагалось сделать свойствами класса Ball radius, color, xPosition и yPosition. Вот как конструктор класса Ball может присваивать эти свойства своим экземплярам (обратите внимание на использование ключевого слова this):

function Ball ( ) {

this.radius = 10;

this.color = 0xFF0000;

this.xPosition = 59;

this.yPosition = 15;

}

С помощью такого конструктора Ball можно создавать экземпляры объектов (т.е. члены класса) с предопределенными свойствами - radius, color, xPosition и yPostion - путем вызова Ball( ) с оператором new, так же, как и раньше. Например:

// Сделать новый экземпляр Ball

bouncyBall = new Ball( );


// Теперь выведем значения свойств bouncyBall,

// присвоенные при создании его конструктором Ball( )

trace(bouncyBall.radius); // Выводит: 10

trace(bouncyBall.color); // Выводит: 16711680

trace(bouncyBall.xPosition); // Выводит: 59

trace(bouncyBall.yPosition); // Выводит: 15

Ну, не здорово ли?

К сожалению, конструктор Ball( ) использует фиксированные величины, присваивая значения свойствам создаваемых им объектов (например, this.radius = 10). Поэтому у всех объектов класса Ball будут одинаковые значения свойств, что прямо противоположно задачам объектно-ориентированного программирования (нет никакой надобности в классе, который порождает одинаковые объекты; именно различия делают их интересными).

Чтобы динамически присваивать значения свойств экземплярам класса, изменим функцию конструктора так, чтобы она принимала параметры. Рассмотрим общий синтаксис, а затем вернемся к примеру класса Ball:

function Constructor (value1, value2, value3) {

this.property1 = value1;

this.property2 = value2;

this.property3 = value3;

}

Внутри функции Constructor ссылка на создаваемый объект осуществляется, как и раньше, с помощью ключевого слова this. Однако на этот раз значения свойств объекта не кодируются жестко. Вместо этого свойствам объекта присваиваются значения параметров value1, value2 и value3. Когда нужно создать новый уникальный член класса, функции конструктора передаются начальные значения свойств:

myObject = new Constructor (value1, value2, value3);

Посмотрим на примере 12-5, как применить это к классу Ball.
^

Пример 12-5. Обобщенный класс Ball


// Зделать конструктор Ball( ) принимающий значения свойств в качестве параметров

function Ball (radius, color, xPosition, yPosition) {

this.radius = radius;

this.color = color;

this.xPosition = xPosition;

this.yPosition = yPosition;

}


// Вызвать конструктор с передачей ему параметров,

// используемых в качестве значений свойств объекта

myBall = new Ball(10, 0x00FF00, 59, 15);


// Теперь посмотрим, получилось ли...

trace(myBall.radius); // Выводит: 10

Создание класса Ball почти завершено. Но можно заметить, что все еще отсутствуют методы moveTo( ) и area( ), о которых говорилось ранее. На практике есть два способа прикрепления методов к объектам класса. Сейчас будет рассмотрен простой и менее эффективный способ, а после рассмотрения темы наследования мы вернемся к вопросу о создании методов.
^

12.5.2.3. Присвоение методов объектам класса


Проще всего добавить метод в класс, присвоив классу в конструкторе свойство, которое содержит функцию. Вот общий синтаксис:

function Constructor( ) {

this.methodName = function;

}

function можно предоставить несколькими способами, что мы изучим на примере добавления метода area( ) в наш класс Ball. Обратите внимание, что для лучшей ясности мы убрали из класса свойства color, xPosition и yPosition.

1. function может являться литералом функции, например:

function Ball (radius) {

this.radius = radius;

// Добавить метод area

this.area = function ( ) { return Math.PI * this.radius * this.radius; };

}

2. В другом варианте function можно объявить внутри конструктора:

function Ball (radius) {

this.radius = radius;

// Добавить метод area

this.area = getArea;

function getArea ( ) {

return Math.PI * this.radius * this.radius;

}

}

3. Наконец, function можно объявить вне конструктора, но присвоить свойству внутри конструктора:

// Объявит функцию getArea( )

function getArea ( ) {

return Math.PI * this.radius * this.radius;

}


function Ball (radius) {

this.radius = radius;

// Добавить метод area

this.area = getArea;

}

Существенной разницы между этими тремя подходами нет: все они абсолютно допустимы. Обычно удобнее всего использовать литералы функций, но они не так способствуют многократному использованию кода, как функции, определяемые вне конструктора, благодаря чему их могут использовать другие конструкторы. Тем не менее, все три способа недостаточно эффективны.

До сих пор мы прикрепляли уникальные значения свойств каждому объекту класса Ball. У каждого объекта ball должны быть собственные значения свойств radius и color, чтобы один объект ball можно было отличить от другого. Но если с помощью описанной технологии присваивать объектам класса фиксированный метод, возникает ненужное дублирование метода в каждом объекте этого класса. Формула area (площади) одна и та же для каждого ball, поэтому код, выполняющий данную задачу, должен быть централизован и обобщен.

Для более эффективного прикрепления к классу свойства или метода с фиксированным значением используется наследование, которое будет следующей изучаемой нами темой.
^

12.5.3. Наследование свойств объектов


Наследуемые свойства не прикрепляются к отдельным экземплярам объектов класса. Они прикрепляются один раз к конструктору класса и при необходимости заимствуются объектами. Эти свойства называют наследуемыми, потому что они передаются создаваемым объектам, а не определяются в каждом из них. Наследуемое свойство кажется принадлежащим объекту, через который к нему обращаются, но в действительности входит в конструктор класса.

На рис. 12-2 показана общая модель наследования свойств на примере класса Ball. Так как методы moveTo( ) и area( ) класса Ball одинаковы для всех его экземпляров, лучше всего реализовать их в виде наследуемых методов. Они принадлежат самому классу, и каждый объект ball обращается к ним только по ссылке. Напротив, свойства radius, color, xPosition и yPosition класса Ball присваиваются объектам как обычные свойства, потому что каждому объекту ball требуются собственные значения этих свойств.


^

Рис. 12-2. Наследуемые и обычные свойства


Наследование происходит в иерархической цепочке подобно родословному дереву. При вызове метода отдельного объекта интерпретатор проверяет, реализует ли данный объект этот метод. Если метод не найден, интерпретатор ищет метод в классе.

Например, при выполнении метода ball1.area( ), интерпретатор проверяет, определен ли в ball1 метод area( ). Если в объекте ball1 метод area( ) отсутствует, интерпретатор проверяет, определен ли этот метод в классе Ball. Если да, то интерпретатор вызывает метод area( ), как если бы это был метод объекта ball1, а не класса Ball. Это позволяет методу действовать на объектом ball1 (а не классом), при необходимости извлекая или задавая свойства ball1. В этом состоит одно из преимуществ ООП: определив функцию в одном месте (классе Ball), можно пользоваться ей во многих местах (любом объекте ball).

В отличие от обычных свойств, унаследованные свойства могут только извлекаться через объект, но не задаваться.

Пора привести маленький код, чтобы оживить все эти понятия.
^

12.5.3.1. Создание наследуемых свойств с помощью свойства prototype


Начнем процесс создания наследуемых свойств с создания функции конструктора класса, такой, как у класса Ball из примера 12-5:

function Ball (radius, color, xPosition, yPosition) {

this.radius = radius;

this.color = color;

this.xPosition = xPosition;

this.yPosition = yPosition;

}

Вспомните из главы 9 "Функции", что функции могут рассматриваться как объекты и поэтому иметь свойства.

СОВЕТ


При создании функции конструктора интерпретатор автоматически задает ей свойство с именем prototype. В свойство prototype интерпретатор помещает родовой объект. Все свойства, прикрепляемые к объекту prototype, наследуются всеми экземплярами класса функции конструктора.

Чтобы создать свойство, которое будет унаследовано всеми объектами класса, это свойство нужно просто присвоить готовому объекту prototype функции конструктора класса. Вот общий синтаксис:

Constructor.prototype.propName = value;

Здесь Constructor является функцией конструктора класса (в данном примере, Ball ); prototype является автоматически создаваемым свойством, используемым для хранения наследуемых свойств; propName является именем наследуемого свойства, а value является значением этого наследуемого свойства. Например, вот как можно добавить глобальное свойство gravity(сила тяжести) ко всему классу объектов Ball:

Ball.prototype.gravity = 9.8;

После размещения свойства gravity можно обращаться к нему из любого члена класса Ball:

// Создать новый экземпляр класса Ball

myBall = new Ball(5, 0x003300, 34, 220);


// Теперь вывести значение унаследованного свойства gravity

trace(myBall.gravity); // Выводит: 9.8

К свойству gravity можно обращаться через myBall, потому что myBall наследует свойства объекта prototype класса Ball.

Поскольку одни и те же методы обычно используются всеми экземплярами класса, их часто хранят в наследуемых свойствах. Добавим наследуемый метод area( ) в класс Ball:

Ball.prototype.area = function ( ) {

return Math.PI * this.radius * this.radius;

}; // Здесь оператор ";" обязателен, т.к. это литерал функции

Теперь давайте добавим наследуемый метод moveTo( ), но на этот раз не с помощью литерала функции, а с помощью предопределенной функции:

function moveTo (x, y) {

this.xPosition = x;

this.yPosition = y;

}


Ball.prototype.moveTo = moveTo;

Если функция определена как наследуемое свойство, ее можно вызывать, как и всякий другой метод:

// Сделать новый ball

myBall = new Ball(15, 0x33FFCC, 100, 50);


// Теперь вызвать унаследованный метод area( ) объекта myBall

trace(myBall.area( )); // Выводит: 706.858347057703

Обратите внимание, что объект конструктора prototype можно целиком заменить новым объектом и в результате одним махом добавить много наследуемых свойств. Однако при этом изменится цепочка наследования, о чем будет рассказано ниже в разделе "Надклассы и подклассы" (Superclasses и Subclasses).
^

12.5.3.2. Замена унаследованных свойств


Чтобы изменить унаследованное свойство для одного объекта, можно назвать свойство этого объекта тем же именем, что и унаследованное свойство. Например, можно задать для одного ball силу тяжести меньше, чем для других объектов ball:

// Создадим конструктор класса Ball

function Ball ( radius, color, xPosition, yPosition ) { ... } // Не показана


// Присвоение унаследованному свойству gravity значение

Ball.prototype.gravity = 9.8


// Создать объект ball

lowGravBall = new Ball ( 200, 0x22DD99, 35, 100 );


// Заменить (переписать) значение унаследованного свойства gravity в объекте lowGravBall

lowGravBall.gravity = 4.5;

Задаваемое для объекта свойство всегда заменяет унаследованное свойство с тем же именем. Это просто следствие характера действия цепочки наследования. Аналогично, определения методов, являющиеся локальными для объекта, заменяют имеющиеся в его классе. Если мы выполняем ball1.area( ) и ball1 определяет метод area( ), выполняется последний метод. Интерпретатор не станет смотреть prototype класса Ball, чтобы узнать, не определен ли и там метод area( ).
^

12.5.3.3. Свойство constructor


Когда создается объект конструктора prototype, интерпретатор автоматически присваивает ему особое свойство с именем constructor. Свойство constructor является ссылкой на функцию конструктора класса prototype. Например, оба следующие выражения дают ссылку на функцию конструктора Ball:

trace(Ball); // Выводит: [Function]

trace(Ball.prototype.constructor); // Тоже выводит: [Function]

// Такая же ссылка, как и первая

Обратите внимание, что свойство constructor содержит ссылку на функцию конструктора, а не на строку представляющую имя функции.

12.5.3.4. Свойство __proto__


При создании любого объекта интерпретатор автоматически присваивает ему особое свойство с именем __proto__ (обратите внимание на два символа подчеркивания с каждой стороны имени). Свойство объекта __proto__ является ссылкой на свойство prototype функции конструктора этого объекта. Например, при создании экземпляра ball с именем myBall, myBall.__proto__ становится равным Ball.prototype:

myBall = new Ball(6, 0x00FF00, 145, 200);

trace(myBall.__proto__ == Ball.prototype); // Выводит: true

Свойство __proto__ используется, главным образом, интерпретатором ActionScript для нахождения унаследованных свойств объекта. Например, при вызове унаследованного метода area( ) через myBall, как в myBall.area( ), ActionScript обращается к методу Ball.prototype.area через myBall.__proto__.

Можно использовать __proto__ непосредственно, чтобы проверить принадлежность объекта определенному классу, как показано в примере 12-6.
^

Пример 12-6. Определение класса объекта


function MyClass (prop) {

this.prop = prop;

}

myObj = new MyClass( );

if (myObj.__proto__ == MyClass.prototype) {

trace("myObj является экземпляром класса MyClass");

}
^

12.5.4. Надклассы и подклассы


Одной из важнейших характеристик классов в продвинутом ООП является их способность совместно использовать свойства. Это означает, что целые классы могут наследовать свойства от одних классов и передавать их другим. В сложных ситуациях способность к множественному наследованию может оказаться необходимой. (Даже если сами вы не станете использовать множественное наследование, понимание его поможет в работе со встроенными классами ActionScript.)

Уже было показано, как объекты наследуют свойства объекта prototype конструктора своего класса. Наследование не ограничивается лишь одной связью объекта/класса. Сам класс может наследовать свои свойства от других классов. Например, может иметься класс Circle (круг), определяющий общий метод area( ) определения площади всех круглых объектов. Вместо определения отдельного метода area( ) в классе Ball можно просто заставить класс Ball наследовать метод area( ), уже присутствующий в классе Circle. Поэтому экземпляры Ball наследуют имеющийся в Circle метод area( ) через Ball. Обратите внимание на иерархию: простейший класс Circle определяет самые общие методы и свойства. Другой класс, Ball, основывается на этом простом классе Circle, добавляя специфические для экземпляров класса Ball особенности, но беря от Circle базовые атрибуты, имеющиеся у всех круглых объектов. В обычном ООП говорят, что класс Ball расширяет класс Circle. Это означает, что Ball является подклассом (subclass) Circle, а Circle является надклассом (superclass) Ball.
^

12.5.4.1. Создание надкласса


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

Constructor.prototype = new SuperClass( );

В следствии замены объекта prototype функции Constructor экземпляром SuperClass все экземпляры Constructor вынуждены наследовать те свойства, которые определены в экземплярах SuperClass. В примере 12-7 сначала создается класс Circle, который присваивает метод area( ) всем своим экземплярам. Затем экземпляр Circle присваивается Ball.prototype, в результате чего все объекты ball наследуют метод area( ) из Circle.
^

Пример 12-7. Создание надкласса


// Создать конструктор Circle (надкласс)

function Circle( ) {

this.area = function ( ) { return Math.PI * this.radius * this.radius; };

}


// Создать конструктор обычного класса Ball

function Ball ( radius, color, xPosition, yPosition ) {

this.radius = radius;

this.color = color;

this.xPosition = xPosition;

this.yPosition = yPosition;

}


// Здесь создается надкласс путем присваивания экземпляра

// Circle свойству prototype конструктора класса Ball

Ball.prototype = new Circle( );


// Теперь создадим экземпляр Ball и проверим его свойства

myBall = new Ball ( 16, 0x445599, 34, 5);

trace(myBall.xPosition); // 34, обычное свойство Ball

trace(myBall.area( )); // 804.24..., метод area( ) унаследован от Circle

Однако у нашей иерархии классов довольно бедная структура: Ball определяет radius, но radius фактически является общим свойством для всех окружностей, поэтому оно должно быть в классе Circle. То же относится к xPosition и yPosition. Чтобы исправить структуру, переместим radius, xPosition и yPosition в Circle, оставив лишь свойство color в Ball. (В нашем примере будем рассматривать color как свойство, которым могут обладать только ball.)

Идейно схему пересмотренных конструкторов Circle и Ball можно представить следующим образом:

// Создать конструктор Circle (надкласс)

function Circle ( radius, xPosition, yPosition ) {

this.area = function ( ) { return Math.PI * this.radius * this.radius; };

this.radius = radius;

this.xPosition = xPosition;

this.yPosition = yPosition;

}


// Создать конструктор класса Ball

function Ball ( color ) {

this.color = color;

}

После перемещения свойств мы сталкиваемся с новой проблемой. Каким образом присваивать значения свойствам radius, xPosition и yPosition, если объекты создаются с помощью Ball, а не Circle ? Необходимо сделать еще одно изменение в коде конструктора Ball. Во-первых, заставим Ball принимать все необходимые свойства в виде параметров:

function Ball ( color, radius, xPosition, yPosition ) {

Затем в конструкторе Ball определим конструктор Circle как метод создаваемого объекта ball:

this.superClass = Circle;

Наконец, вызовем конструктор Circle с объектом ball и передадим ему значения свойств radius, xPosition и yPosition:

this.superClass(radius, xPosition, yPosition);

Полный код класса/надкласса показан в примере 12-8.
^

Пример 12-8. Класс и его надкласс


// Создать конструктор Circle (надкласс)

function Circle ( radius, xPosition, yPosition) {

this.area = function ( ) { return Math.PI * this.radius * this.radius; };

this.radius = radius;

this.xPosition = xPosition;

this.yPosition = yPosition;

}


// Создать конструктор класса Ball

function Ball ( color, radius, xPosition, yPosition ) {

// Определить надкласс Circle как метод создаваемого объекта ball

this.superClass = Circle;

// Вызвать конструктор Circle как метод объекта ball, передав

// ему значения, полученные как параметры конструктора Ball

this.superClass(radius, xPosition, yPosition);

// Задать цвет объекта ball

this.color = color;

}


// Присвоить экземпляр надкласса Circle свойству

// prototype конструктора класса Ball

Ball.prototype = new Circle( );


// Теперь создадим экземпляр Ball и проверим его свойства

myBall = new Ball ( 0x445599, 16, 34, 5);

trace(myBall.xPosition); // 34

trace(myBall.area( )); // 804.24...

trace(myBall.color); // 447836

Заметьте, что слово superClass в Ball не является зарезервированным или специальным. Это просто удобное имя для функции конструктора надкласса. Кроме того, метод area( ) класса Circle можно было бы определить в Circle.prototype. Начав практически программировать с помощью классов и объектов, вы несомненно заметите определенную гибкость, которую предоставляют инструменты ActionScript при создании иерархии классов и реализации наследования. Возможно, потребуется адаптировать описанные в данной главе подходы, чтобы они наилучшим образом соответствовали тонким особенностям конкретного приложения.

12.5.4.2. Полиморфизм


Наследование делает возможным другое ключевое понятие ООП - полиморфизм (polymorphism). Слово полиморфизм означает "множество форм". Это значит, что объекту сообщается, что он должен сделать, но не говорится как (как в поговорке "Different strokes for different folks"). Лучше всего проиллюстрировать это примером. Допустим, разрабатывается игра про полицейских и грабителей. Одновременно на экране рисуется много полицейских, грабителей и невинных прохожих. Полицейские преследуют грабителей, грабители убегают от полицейских, а пораженные и испуганные прохожие перемещаются случайным образом. Допустим, что в код игры для каждой категории этих лиц создается класс объектов:

function Cop( ) { ... }

function Robber( ) { ... }

function Bystander( ) { ... }

Кроме того, создается надкласс Person, наследниками которого являются классы Cop, Robber и Bystander:

function Person( ) { ... }

Cop.prototype = new Person( );

Robber.prototype = new Person( );

Bystander.prototype = new Person( );

В каждом кадре Flash-ролика каждый персонаж на экране должен двигаться согласно правилам для своего класса. Для этого определим в каждом объекте метод move( ) (метод move( ) настраивается для каждого класса):

Person.prototype.move = function ( ) { ... движение по умолчанию ... }

Cop.prototype.move = function ( ) { ... движение в преследовании ... }

Robber.prototype.move = function ( ) { ... движение при убегании ... }

Bystander.prototype.move = function ( ) { ... движение в случайном порядке ... }

Требуется, чтобы в каждом кадре Flash-ролика все персонажи перемещались по экрану. Для управления всеми действующими лицами создадим главный массив объектов Person. Вот пример того, как можно заполнить массив persons:

// Создать полицейских

cop1 = new Cop( );

cop2 = new Cop( );


// Создать грабителей

robber1 = new Robber( );

robber2 = new Robber( );

robber3 = new Robber( );


// Создать прохожих

bystander1 = new Bystander( );

bystander2 = new Bystander( );


// Создать массив, заполненный полицейскими, грабителями и прохожими

persons = [cop1, cop2, robber1, robber2, robber3, bystander1, bystander2];

В каждом кадре Flash-ролика вызывается функция moveAllPersons( ) (переместить всех), которая определена так:

function moveAllPersons( ) {

for (var i=0; i < persons.length; i++) {

persons[i].move( );

}

}

При вызове функции moveAllPersons( ) все полицейские, грабители и прохожие переместятся по отдельным правилам, которые определены в методах move( ) их классов. Это и есть полиморфизм в действии: объекты с общими характеристиками можно организовать вместе, но при этом они сохраняют свою индивидуальность. У полицейских, грабителей и прохожих много общего, что воплощено в надклассе Person. У них есть общие действия, например, они умеют перемещаться. Однако реализовывать эти общие действия они могут по-разному, и могут иметь другие специфические для каждого класса действия и данные. Полиморфизм позволяет единообразно обращаться с разнородными объектами. Функция move( ) применяется для перемещения всех лиц, хотя в каждом классе есть своя собственная функция move( ).
^

12.5.4.3. Определение принадлежности объекта к надклассу


Предположим, что имеется класс Shape (фигура) и класс Rectangle (прямоугольник), для которого класс Shape является надклассом. Чтобы проверить, является ли объект потомком Shape, нужно улучшить метод примера 12-6, чтобы он проходил по цепочке объектов прототипов (называемой цепочкой прототипов (prototype chain)). Эта техника продемонстрирована в примере 12-9.
^

Пример 12-9. Проход по цепочке прототипов


// Эта функция проверяет, является ли theObj потомком theClass

function objectInClass(theObj, theClass) {

while (theObj.__proto__ != null) {

if (theObj.__proto__ == theClass.prototype) {

return true;

}

theObj = theObj.__proto__;

}

return false;

}


// Сделать новый экземпляр Rectangle

myObj = new Rectangle( );


// Теперь проверим, является ли myRect наследником класса Shape

trace (objectInClass(myRect, Shape)); // Выводит: true
^

12.5.4.4. Окончание цепочки наследования


Все объекты ведут свое происхождение от класса верхнего уровня Object. Поэтому все объекты наследуют свойства, определенные в конструкторе Object, а именно, методы toString( ) и valueOf( ). Поэтому можно добавить новые свойства к каждому объекту Flash-ролика путем введения новых свойств в класс Object. Свойства, прикрепленные к Object.prototype, будут распространяться по всей иерархии классов, включая все внутренние объекты и даже объекты movieclip (мувиклип)! В результате можно создавать действительно глобальные переменные или методы. Например, в следующем коде ширина и высота рабочего стола определяются свойством prototype класса Object. После этого данная информация становится доступна в любом мувиклипе:

Object.prototype.mainstageWidth = 550;

Object.prototype.mainstageHeight = 400;

trace(anyClip.mainstageWidth); // Выводит: 550

Свойства Object.prototype наследуются не только мувиклипами, но и всеми объектами, поэтому даже пользовательские объекты и экземпляры других встроенных классов, таких как Date и Sound, наследуют свойства, присваиваемые Object.prototype.

^ Упражнение для самостоятельной работы

Прикрепить новые свойства и методы можно к любому встроенному классу. Попробуйте прикрепить нечувствительную к регистру функцию сортировки по алфавиту из примера 11-6 к классу Array в качестве наследуемого метода.
^

12.5.4.5. Сравнение с терминологией Java


В нашем обзоре классов и иерархий классов мы сталкивались со свойствами, определяемыми для объектов, конструкторов класса и прототипов класса. В Java и C++ существуют специальные имена для различных типов свойств классов и объектов. Для удобства программистов на Java в табл. 12-1 приведены приблизительные эквиваленты между Java и ActionScript.
^

Таблица 12-1. Эквивалентные свойства в Java и ActionScript


Java

Описание

ActionScript

Пример для ActionScript

Переменные экземпляра

Локальные переменные экземпляра объекта

Свойства, определенные в функции конструктора класса и копируемые в объекты

function Square (side) {

this.side = side;

}

Методы экземпляра

Методы, вызываемые на экземпляре объекта

Методы, определенные в объекте prototype функции конструктора класса, доступ к которым при вызове с объектом автоматически осуществляется через prototype

Square.prototype.area = squareArea;


mySquare.area( );

Переменные класса

Переменные, имеющие одно и то же значение для всех экземпляров объектов класса

Свойства, определенные как свойства функции для функции конструктора класса

Square.numSides = 4;

Методы класса

Методы, вызываемые через класс

Методы, определенные как свойства функции для функции конструктора класса

Square.findSmaller =

function (square1, square2) { ... }
^

12.5.5. Краткое резюме по объектно-ориентированному программированию


Классы и наследование открывают целый мир возможностей совместного использования информации многими объектами. ООП служит основой всего ActionScript. Не зависимо от того, в какой мере вы используете возможности классов и объектов в своих сценариях, понимание их общих принципов составляет важную часть понимания среды Flash-программирования. В последнем разделе этой главы будет показано, что уверенное владение ООП существенно влияет на уверенность в ActionScript в целом.

Для более глубокого ознакомления с ООП на языках, производных от ECMA-262, обратитесь к документации Netscape по JavaScript, Details of the Object Model:

http://developer.netscape.com/docs/manuals/js/core/jsguide/obj2.htm

В каноническом руководстве Дэвида Фланагана (David Flanagan) JavaScript: The Definitive Guide (O'Reilly & Associates, Inc.) также содержится ценная информация по ООП в JavaScript. Общее введение в ООП с точки зрения Java можно найти в Object Oriented Programming Concepts (из The Javatm Tutorial) фирмы Sun:

http://java.sun.com/docs/books/tutorial/java/concepts
^

12.6. Встроенные классы и объекты ActionScript


Мы действительно далеко ушли вперед после главы 1 "Легкое введение для непрограммистов". Наше первое столкновение с компонентами ActionScript было просто чтением элементов под кнопкой "плюс" (+) на панели Actions. С того момента мы узнали о данных и выражениях, операторах, предложениях и функциях, а только что изучили понятие классов и объектов. Настало время нанести последние мазки на создаваемую картину языка ActionScript.

ActionScript предоставляет целый ряд синтаксических средств: выражения содержат данные; операторы обрабатывают данные; предложения дают инструкции; функции объединяют инструкции в переносимые команды. Это средства, и всего лишь средства. Это грамматика, используемая при написании инструкций в сценариях. Нам все еще не хватает темы для обсуждения. Сейчас мы отлично знаем, как говорить на ActionScript, но нам не о чем говорить. Этот пробел заполняют встроенные классы и объекты ActionScript.
^

12.6.1. Встроенные классы


Точно так же, как мы определяем свои классы для описания объектов и действий с ними, ActionScript определяет собственные классы данных. Множество готовых классов, включая класс Object, встроено непосредственно в язык ActionScript. Встроенные классы могут управлять физической средой Flash-ролика.

Например, один из встроенных классов, Color, определяет методы, способные определять или задавать цвет мувиклипа. Чтобы использовать эти методы, сначала необходимо создать объект Color с помощью конструктора класса Color( ), например:

clipColor = new Color(target);

где clipColor может являться переменной, элементом массива или свойством объекта, в которых хранится объект Color. Конструктор Color( ) принимает один параметр, target, который задает имя мувиклипа, цвет которого нужно узнать или задать.

Допустим, есть мувиклип с именем square, и необходимо задать его цвет. Создадим новый объект Color:

squareColor = new Color(square);

Чтобы задать цвет мувиклипу square, вызываем один из методов класса Color с объектом squareColor:

squareColor.setRGB(0x999999);

Метод setRGB( ) задает RGB-значение цвета для target объекта squareColor, который в данном случае является square, поэтому предшествующий вызов метода делает цвет мувиклипа square серым.

Поскольку объект Color является встроенным классом, он может непосредственно задавать цвет мувиклипа. Другие классы позволяют управлять звуками, датой и XML-документами. Все, что касается встроенных классов, будет рассказано в части III "Справочник по языку".
^

12.6.2. Встроенные объекты


Подобно встроенным классам, встроенные объекты позволяют управлять окружением Flash-ролика. Например, объект Key определяет ряд свойств и методов, которые сообщают о состоянии клавиатуры компьютера. Для использования этих свойств и методов не нужно создавать объект Key, его можно использовать непосредственно. Встроенные объекты автоматически создаются интерпретатором при запуске проигрывателя Flash и доступны на протяжении всего Flash-ролика.

Выведем, например, код нажатой в данный момент клавиши с помощью метода getCode( ) объекта Key:

trace(Key.getCode( ));

А теперь проверим, нажата ли клавиша пробела, с помощью метода isDown( ), которому передается в качестве параметра код клавиши пробела:

trace(Key.isDown(Key.SPACE));

В части III "Справочник по языку" будет рассказано о других встроенных объектах, таких как Math, Mouse и Selection, которые предоставляют доступ к математическим данным, указателю мыши и выделению в текстовых полях.
^

12.6.3. Знание всех ходов и выходов


Умение написать правильный код на ActionScript составляет лишь половину освоения программирования для Flash. Вторая половина состоит в изучении имеющихся встроенных классов и объектов с их многочисленными замечательными свойствами и методами. Этой задачей мы займемся в части III "Справочник по языку". Однако необязательно изучать все классы и объекты в один присест. Начните с изучения мувиклипов, и по мере необходимости обращайтесь и к другим темам. Со временем вы узнаете, что нужно для решения вашей конкретной задачи. Важно понять общую структуру ООП. Если понять правила системы, то изучение нового объекта или класса сводится просто к просмотру имеющихся у него методов и свойств.
1   2   3   4   5   6   7   8   9   ...   82



Скачать файл (21152.1 kb.)

Поиск по сайту:  

© gendocs.ru
При копировании укажите ссылку.
обратиться к администрации
Рейтинг@Mail.ru