Flash Checker, Teil 2: Objektorientiertes JSFL

Im ersten Teil des Flash Checkers habe ich eine einfache Flash-Erweiterung verfasst, die die Dokumenteinstellungen einer FLA-Datei prüft. Dem einen oder anderen mag es übel aufstoßen, dass diese Erweiterung für die Flash Entwicklungsumgebung in JavaScript verfasst wurde. Mal abgesehen davon, dass – wer unbedingt will – auch DLLs programmieren und als Erweiterung einbinden kann, ist JavaScript jedoch besser als sein Ruf: Beispielsweise die objektorientiere Programmierung ist durchaus möglich. Wenn auch nur Prototypen basiert. Das heißt, dass man bei JavaScript die Vererbung per Hand über sogenannte Prototypen erreicht. Denn jedes Objekt in der JavaScript-Welt verfügt über eine Prototyp-Eigenschaft, die auf ein anderes Objekt verweist. Und sollte eine Methode oder Eigenschaft nicht in einem Objekt verfügbar sein, dann wird halt im Prototyp nachgeschaut. Und sollte in diesem Objekt die Methode oder Eigenschaft ebenfalls nicht verfügbar sein, dann wird halt in dessen Prototyp nachgeschaut. Und so weiter und so fort…

Das Pendant zu einer Klasse erstellen Sie in JavaScript mit einer Funktion.

1
2
3
function FlashChecker () {
	this.property = "foo";
}

Eine Instanz dieser „Klasse“ erzeugt das Schlüsselwort new, in dem erst ein neues Objekt angelegt und die Funktion ähnlich einem Konstruktor im Kontext dieses neuen Objektes ausgeführt wird (das Schlüsselwort this bezieht sich in diesem Fall auf das gerade neu erzeugte Instanzobjekt).

1
var checker = new FlashChecker();

Es ist gängige Praxis, die Methoden einer „Klasse“ in das Prototyp-Objekt zu schreiben, damit die Methoden nur einmal deklariert und nur einmal im Speicher abgelegt werden.

1
2
3
4
5
6
7
8
9
10
11
12
FlashChecker.prototype.checkDocumentSettings = function (currentDocument) {
	var playerVersion = currentDocument.getPlayerVersion();
	var asVersion = currentDocument.asVersion;
	var fps = currentDocument.frameRate;
	var height = currentDocument.height;;
	var width = currentDocument.width;
	if (playerVersion != "9") fl.trace("Warning: Wrong player version!");
	if (asVersion != 3) fl.trace("Warning: Wrong ActionScript version!");
	if (fps != 24) fl.trace("Warning: Wrong framerate!");
	if (height != 800) fl.trace("Warning: Wrong height!");
	if (width != 800) fl.trace("Warning: Wrong width!");	
}

Die Instanzen haben dann über den Prototyp implizit (also ohne dass man es extra hinschreiben muss) per __proto__-Eigenschaft Zugriff darauf, so dass der Verwendung durch die Instanzen nichts im Wege steht.

1
2
3
var checker = new FlashChecker();
var currentDocument = fl.getDocumentDOM();
checker.checkDocumentSettings(currentDocument);