Macromedia Flash 5. Объектно - ориентированное программирование

       

Старшинство


Теперь у нас есть пример, где у всех собак по четыре лапы, а у некоторых ещё и космы (то есть свойство puffyHair). Рухнет ли наша модель, если yeller подскользнётся и поранит одну лапу в результате неаккуратного обращения с пилой. Мы не хотим писать Dog.prototype.legs = 3, потому что это изменение коснётся всех собак (если только мы не пройдёмся той же пилой по остальным... брр!). Возвращаясь к модели со слоями стекла, мы увидим, что лучшее место, где можно зафиксировать такой трагический поворот событий, это первый слой, принадлежащий yeller'у. Всё произойдёт точно так же, как в своё время fido получил модную причёску. Это логично, ведь беда приключилась только с yeller'ом, а не со всеми собаками сразу. Но что случится, если вы измените свойство yeller'а с помощью следующего выражения:

yeller.legs = 3?

Затронет ли такое изменение (значение Dog.prototype.legs меняется на 3) какие-нибудь ещё элементы? К счастью для всего собачьего сообщества, нет. ActionScript не позволит экземпляру случайно изменить свой прототип (подробнее об этом в разделе Защита). Вы защищены от собственной криворукости! Можете снова пользоваться пилой.

Постойте-ка, но ведь у yeller'а теперь два свойства legs - одно в его экземпляре, другое - в прототипе? Давайте сейчас снова вернёмся к модели многослойных стёкол. Действительно, теперь есть бумажка, с надписью legs = 4 на слое прототипа, и ещё одна с надписью legs = 3 на слое экземпляра. Но существует одно правило: если два "кусочка бумаги" имеют одно и то же имя свойства, то они перекрываются, помните? Итак, эти две бумажки как бы "встали на одну прямую", и какую же из них мы видим? Верхнюю, разумеется. Таким образом, получится, yeller.legs == 3. Вот что произойдёт с нашим кодом:

Dog = function( ){} Dog.prototype.legs = 4;

yeller = new Dog( ); yeller.legs = 3;

Это должно выглядеть логичным даже для тех, кто совсем ничего не понимает: "У собак по четыре лапы, но у yeller'а их три". Именно это и называется старшинством. Если у двух или более свойств обнаружены одинаковые имена, возвращается то из них, которое находится ближе всего к экземпляру. Аллегория со слоями стекла очень показательна. Если один предмет закрывает другой, то вы видите только ближайший к вам. Разумеется, если вы уберёте передний, то снова увидите тот, что был позади него. Но точно ли так обстоит дело с прототипами? Сохранилось ли ещё то первое свойство? Да, сохранилось. Удалите "закрывающее" свойство, и вы снова его увидите. Вот, как это будет выглядеть:

trace( yeller.legs ); // 3 - из экземпляра delete( yeller.legs ); trace( yeller.legs ); // 4 - из прототипа

Из вышеприведённого примера видно, что личное свойство yeller'а legs просто перекрыло или "старше" (вспомним армию) свойства Dog.prototype.legs. Может читать это так: "Когда-то у yeller'а было три лапы, но теперь, хвала современной медицине!, у него, как и у всех остальных собак их снова четыре". И вновь на глаза наворачиваются слёзы.

<<

   ООП во Flash 5    >>



Содержание раздела