Показать сообщение отдельно
Старый 30.09.2006, 23:37
Aziz Zaynutdinoff вне форума Посмотреть профиль Отправить личное сообщение для Aziz Zaynutdinoff Посетить домашнюю страницу Aziz Zaynutdinoff Найти все сообщения от Aziz Zaynutdinoff
  № 15  
Ответить с цитированием
Aziz Zaynutdinoff
 
Аватар для Aziz Zaynutdinoff

Регистрация: Feb 2006
Адрес: Moscow
Сообщений: 552
По умолчанию 21. Использование прототипов (prototype)

Прототип объекта в ActionScript — это объект, который существует среди классов, чьи значения доступны для всех экземпляров класса, к которым он (объект) принадлежит. В ActionScript 1.0/2.0 prototype использовался для контроля наследования класса. Когда экземпляр подкласса обращается к переменной, сначала проверяется наличиие этой переменной в текущем экземпляре класса, потом (если не нашел) в прототипе данного класса, потом в прототипе базового класса, и так далее по цепочке наследственности (прототипов), до тех пор пока есть базовые классы.

В ActionScript 3.0 наследование в основном управляется через Класс Наследований и не зависит от прототипа объекта. Однако, прототип объекта всё же существует и обеспечивает большую часть функциональности, как это было и в AS1.0/2.0

Каждый класс и внутриклассовая функция (метод), созданные в ActionScript 3.0 имеют прототипный объект связанный с ними. Для классов прототип имеет имеет аттрибут «read-only», что значит, что вы не можете изменять его значение новым. Однако, это вовсе не значит, что вы не можете задать новую переменную и присвоить ей значение внутри прототипа (иначе наличие прототипа было б бессмысленным ). Прототипы функций изменяемы, что позволяет создавать динамические классы, используя определение классов написанием функций и определением наследований через прототипы («old style» как это делалось раньше).

Пример:

ActionScript Code:
Код:
package {
   
    import flash.display.Sprite;
   
    public dynamic class MyClass extends Sprite {
       
        public function MyClass(){
           
            // prototype = new Object(); // ОШИБОЧНО, нельзя изменить прототип класса
            prototype.newValue = 1; // OK, добавляем (или удаляем) переменные в прототип
           
            trace(this.newValue); // 1
            trace(prototype.toString); // function Function() {}
            trace(prototype.addChild); // undefined
            trace(addChild); // function Function() {}

            // динамическое определение класса («old style»)
            var TempClass:Function = function():void {
                trace("Создаём TempClass");
            }
           
            TempClass.prototype = prototype; // OK, можно утсанавливать наследствования
           
            var tempObject:* = new TempClass(); // «Создаём TempClass»
           
            trace(tempObject.newValue); // 1
        }
    }
}
Помните: обязательно ставить префикс this, обращаясь к динамичным перемнным. Также следует учитывать, что методы класса Object динамичны и определены прототипом (поэтому не могу перекрываться при помощи override). также следует отметить, что tempObject имеет тип «*» вместо TempClass. Потому что TempClass распознаётся всего лишь как функция в AS3.0, не класс, хотя может использоваться и как класс. Все динамические классы (созданные как TempClass) всегда будут распознаваться как функции (хотя и существует тип Class), поэтому созданные таким путём классы всегда порождают собой экземпляры простых объектов.