Omdat ActionScript 3.0 voortborduurt op vorige versies van ActionScript, is het wellicht nuttig te begrijpen hoe het ActionScript-objectmodel is ontwikkeld. ActionScript is begonnen als een eenvoudig mechanisme voor het schrijven van scripts in vorige versies van Flash professional. De programmeurs maakten echter steeds complexere toepassingen met ActionScript. Om dergelijke programmeurs tegemoet te komen, zijn er taalfuncties aan elke nieuwe uitgave toegevoegd die het maken van complexe toepassingen vereenvoudigen.
ActionScript 1.0
ActionScript 1.0 verwijst naar de taalversie die in Flash Player 6 en lager is gebruikt. Zelfs in deze vroege ontwikkelingsfase was het ActionScript-objectmodel al gebaseerd op het concept van het object als een fundamenteel gegevenstype. Een ActionScript-object is een samengesteld gegevenstype met een groep
eigenschappen
. In de beschrijving van het objectmodel staat de term
eigenschappen
voor alles dat aan een object is gekoppeld, zoals variabelen, functies of methoden.
Hoewel de eerste generatie van ActionScript de definitie van klassen met het trefwoord
class
niet ondersteunt, kunt u een klasse definiëren met het gebruik van een speciaal object dat een prototypeobject heet. In plaats van dat u het trefwoord
class
gebruikt om een abstracte klassendefinitie te maken die u instantieert in concrete objecten, zoals in talen die op klassen zijn gebaseerd zoals Java en C++, gebruiken op prototypen gebaseerde talen zoals ActionScript 1.0 een bestaand object als model (of prototype) voor andere objecten. Objecten in een taal die op klassen is gebaseerd, wijzen wellicht naar een klasse die als sjabloon dient, maar objecten in een taal die op prototypen is gebaseerd wijzen naar een ander object, het prototype, dat als sjabloon dient.
Als u een klasse in ActionScript 1.0 wilt maken, definieert u een constructorfunctie voor die klasse. In ActionScript zijn functies eigenlijk objecten, niet alleen abstracte definities. De constructorfunctie die u maakt, dient als het prototypeobject voor instanties van die klasse. De volgende code maakt een klasse met de naam Shape en definieert een eigenschap met de naam
visible
die standaard is ingesteld op
true
:
// base class
function Shape() {}
// Create a property named visible.
Shape.prototype.visible = true;
Deze constructorfunctie definieert een klasse Shape die u als volgt kunt instantiëren met de operator
new
:
myShape = new Shape();
Het constructorfunctieobject
Shape()
dient als het prototype voor instanties van de klasse Shape, maar kan ook als het prototype dienen voor subklassen van Shape, oftewel voor andere klassen die de klasse Shape uitbreiden.
Het maken van een klasse die een subklasse van de klasse Shape is, gebeurt in twee stappen. Maak eerst de klasse door als volgt een constructorfunctie voor de klasse te definiëren:
// child class
function Circle(id, radius)
{
this.id = id;
this.radius = radius;
}
Gebruik vervolgens de operator
new
om te declareren dat de klasse Shape het prototype voor de klasse Circle is. Elke klasse die u maakt, gebruikt standaard de klasse Object als het prototype; dit houdt in dat
Circle.prototype
momenteel een algemeen object bevat (een instantie van de klasse Object). Als u wilt opgeven dat de prototype van Circle Shape is in plaats van Object, gebruikt u de volgende code om de waarde van
Circle.prototype
te wijzigen zodat deze een object Shape bevat in plaats van een algemeen object:
// Make Circle a subclass of Shape.
Circle.prototype = new Shape();
De klasse Shape en de klasse Circle zijn nu aan elkaar gekoppeld in een overervingsrelatie die bekend staat als de
prototypeketen
. Het diagram illustreert de relaties in een prototypeketen:
De basisklasse aan het eind van elke prototypeketen is de klasse Object. De klasse Object bevat een eigenschap van het type static met de naam
Object.prototype
die wijst naar het basisprototypeobject voor alle objecten die zijn gemaakt in ActionScript 1.0. Het volgende object in de prototypeketen in het voorbeeld is het object Shape. Dit wegens het feit dat de eigenschap
Shape.prototype
nooit expliciet is ingesteld, zodat het nog steeds een algemeen object bevat (een instantie van de klasse Object). De laatste koppeling in deze keten is de klasse Circle, die is gekoppeld aan zijn prototype, de klasse Shape (de eigenschap
Circle.prototype
bevat een object Shape).
Als we een instantie van de klasse Circle maken, zoals in het volgende voorbeeld, overerft de instantie de prototypeketen van de klasse Circle:
// Create an instance of the Circle class.
myCircle = new Circle();
Er is reeds een eigenschap met de naam
visible
gemaakt als een lid van de klasse Shape. In ons voorbeeld bestaat de eigenschap
visible
niet als een deel van het object
myCircle
, alleen als een lid van het object Shape, maar de volgende coderegel geeft toch
true
weer:
trace(myCircle.visible); // output: true
De uitvoering kan controleren of het object
myCircle
de eigenschap
visible
overerft door de prototypeketen naar boven te doorlopen. Wanneer deze code wordt uitgevoerd, zoekt de uitvoering eerst in de eigenschappen van het object
myCircle
naar een eigenschap met de naam
visible
, maar vindt een dergelijke eigenschap niet. Deze zoekt vervolgens in het object
Circle.prototype
, maar vindt nog steeds geen eigenschap met de naam
visible
. Naarmate deze de prototypeketen naar boven doorloopt, wordt uiteindelijk de eigenschap
visible
gevonden die is gedefinieerd voor het object
Shape.prototype
en geeft hij de waarde van die eigenschap weer.
Om het eenvoudig te houden, zijn veel details van de prototypeketen weggelaten. Het is in plaats daarvan de bedoeling om u voldoende informatie te geven, zodat u het objectmodel van ActionScript 3.0 beter begrijpt.
ActionScript 2.0
ActionScript 2.0 introduceerde nieuwe trefwoorden zoals
class
,
extends
,
public
en
private
, waarmee u klassen op een herkenbare manier kon definiëren voor iedereen die met talen werkt die op klassen zijn gebaseerd, zoals Java en C++. Het is belangrijk om te weten dat het onderliggende overervingsmechanisme niet veranderde tussen ActionScript 1.0 en ActionScript 2.0. In ActionScript 2.0 werd alleen een nieuwe syntaxis toegevoegd voor het definiëren van klassen. De prototypeketen werkt in beide taalversies op dezelfde manier.
Met de nieuwe syntaxis die in ActionScript 2.0 werd geïntroduceerd, zoals getoond in het volgende fragment, kunt u klassen op een manier definiëren die voor vele programmeurs intuïtiever was.
// base class
class Shape
{
var visible:Boolean = true;
}
ActionScript 2.0 heeft ook typeannotaties geïntroduceerd die werden gebruikt wanneer bij compilatie de typen werden gecontroleerd. Hierdoor kunt u declareren dat de eigenschap
visible
in het vorige voorbeeld slechts een Booleaanse waarde bevat. Het nieuwe trefwoord
extends
vereenvoudigt ook het maken van een subklasse. In het vorige voorbeeld wordt het proces van twee stappen dat nodig is in ActionScript 1.0 met het trefwoord
extends
in slechts één stap gerealiseerd:
// child class
class Circle extends Shape
{
var id:Number;
var radius:Number;
function Circle(id, radius)
{
this.id = id;
this.radius = radius;
}
}
De constructor wordt nu gedeclareerd als deel van de klassendefinitie en de klasseneigenschappen
id
en
radius
moeten ook expliciet worden gedeclareerd.
ActionScript 2.0 heeft ook ondersteuning toegevoegd voor de definitie van interfaces, waarmee u objectgeoriënteerde programma’s kunt verfijnen met formeel gedefinieerde protocollen voor interobjectcommunicatie.