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

       

Защита. Изменения свойств прототипов


Мы имеем доступ к свойствам в прототипе, как если бы они находились в экземпляре. Любое свойство в экземпляре имеет приоритет перед свойством в прототипе его класса, если имена этих свойств совпадают. Однако, вы наверняка уже догадались, что если у нас есть доступ к свойствам в прототипе, словно бы они принадлежали экземпляру, то мы имеем возможность изменять их, верно? Давайте создадим койота (Coyote), он настолько туп (кстати, как вы думаете, насколько именно?), что уже отгрыз себе три лапы, но не ту которую следовало бы и всё ещё находится в капкане. Раз за разом он лишался одной из лап, так что наш пример будет выглядеть так:

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

ralph = new Coyote( ); ralph.legs--; ralph.legs--; ralph.legs--;

Но возникает проблема. Догадываетесь, какая? Правильно, койот всё равно не может убежать. Свойство legs находится в Coyote.prototype, а не в экземпляре ralph. Когда мы пишем ralph.legs--, то ожидаем, что свойство legs в Coyote.prototype будет иметь меньшее значение. Так возникает очень большая проблема для всех койотов, потому что они все получают свои legs из того же Coyote.prototype которое теперь имеет значение 3 вместо 4. Одна капля дёгтя портит весь мёд в бочке. Может вообще не помещать элементы в прототип? Шутка! Вообще-то, есть одно прекрасное решение проблемы ("автоматический" значит "прекрасный") и мы уже говорили об этом, когда бы экземпляр ни изменял свойство прототипа (legs--), это свойство сначала копируется в экземпляр и только после этого даёт себя изменить. Таким образом, это избавляет нас от ненужных хлопот со свойствами, идущими из прототипа. Вам даже не нужно задумываться о том, откуда пришло то или иное свойство. Если вы изменяете свойство в экземпляре, то на самом деле вы говорите следующее: "это свойство в этом экземпляре теперь другое". Наконец-то стало понятно, почему такие изменения происходят в экземплярах, если даже свойства пришли откуда-то из других мест. Однако, при обращении к свойству, нет никакой необходимости вызывать информацию, хранящуюся в экземпляре, если это свойство принадлежит всему классу.


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

Human= function( ){} Human.prototype.ears = 4; // у всех людей нормальные уши // Должно быть, это свойство задаётся где-то в начале жизни

john = new Human( ); john.ears++; // уши копируются в экземпляр 'john' и затем увеличиваются // Это случается спустя несколько мнгновений после появления Джона

В данном случае свойство ears появилось в прототипе и было скопировано в экземпляр (одновременно сохраняясь неизменным в прототипе). Ваш мозг никогда не вообразит, что у всех людей вырастут большие уши после встречи с Джоном, так как информация об ушах Джона хранится в его (Джона) экземпляре. ActionScript автоматически делает то же самое. Ну а что если мы случайно удалим объект в прототипе, а не в экземпляре? Ничего страшного не произойдёт. ActionScript не позволит удалить объект в прототипе, если только не обращаться напрямую к Human.prototype.ears вместо того, чтобы работать с john.ears или с this.ears, как обычно бывает в таких случаях. В прототипе элементы находятся в безопасности, экземпляр не может изменить такое свойство, если только не дать ему на то специальных полномочий, позволяя делать всё, что угодно даже с самим собой. Кстати, Джон недавно отгрыз себе оба уха и не может завести подружку...

<<

   ООП во Flash 5    >>


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