Прототип объекта в 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), поэтому созданные таким путём классы всегда порождают собой экземпляры простых объектов.