function vers. prototype

geos

Mitglied
Worin liegt der Unterschied zwischen

PHP:
MovieClip.prototype.myFunction=function(){
...myAnweisungen
}
und
PHP:
function myFunction () {
...myAnweisungen
}

Gruß

Georg
 
Mit prototype kannst du in vorhandenen Klassen neue Methoden definieren. Dies kann dir in Flash bei größeren Projekten einige Vorteile verschaffen. Für nähere Informationen zu OOP kannst du bei google sicherlich einige gute Seiten finden.

ps: prototoype funktioniert mit Flash MX 2004 nicht mehr. Oder besser gesagt in AS 2 . Du kannst aber in den Exportiereigenschaften AS 1 einstellen.

-keen!
 
Hallo Georg,

der Unterschied liegt darin, dass du mit ersterem die Funktion myFunction zu einer Methode (Funktion eines Objektes) der MovieClip-Klasse machst - und damit jedem vorhandenen MovieClip deines Filmes die Möglichkeit gibst, diese Funktion für sich selbst zu verwenden, indem diese Funktion auf den MovieClip selbst vererbt wird, bspw.
PHP:
MovieClip.prototype.ruecken = function() {
    this._x += 50;
}

beliebigerMovieclip.ruecken();
Jede mögliche Instanz der Klasse MovieClip besitzt nun also die Möglichkeit, sich selbst über ein Ausführen der ruecken-Methode fortzubewegen.

Wolltest du dies mit einer Funktion machen, dann bspw. wie folgt:
PHP:
function ruecken() {
    beliebigerMovieclip._x += 50;
}

ruecken();
Bis hierhin sind die Funktionen quasi praxis-identisch. bloß dass die erste Variante in diesem Fall universaler ist, denn jeder beliebige MovieClip kann sie verwenden, bei der zweiten Variante hingegen müsstest du jedesmal eine neue Funktion schreiben, wenn du eine andere Instanz bewegen möchtest; oder aber du bringst hier ein Argument in die Funktion:
PHP:
function ruecken(ziel) {
    this[ziel]._x += 50;
}

ruecken(beliebigerMovieclip);
Auch damit hättest du quasi den Effekt, dass du durch zusätzliche Angabe einer Zielinstanz auch für diese jederzeit die gewünschte Funktion ausführen könntest.

Im Prinzip ist die prototype-Variante einfach diejenige eines Systems, welches OOP heißt: objektorientierte Programmierung; sie fällt als eins von vielen Teilen des gesamten OOP-Systems zum Komfort des Programmierers oder Scripters ins Gewicht und ermöglicht durch ihren Einsatz einfach eine viel gegliedertere Struktur im Scriptingeinsatz.
Dabei bildet das prototype-Objekt als Unterobjekt einer jeden Klasse wie MovieClip, Button, Sound u.v.m. einen Sammelcontainer aller möglichen Eigenschaften und Funktionen, die anschließend auf jede einzelne verwendete Instanz dieser Klasse im Film übertragen (vererbt) werden,

Sollte dich der OOP-Aspekt reizen, kann man hier sicher noch weitere Worte folgen lassen, ich will dich aber nicht zu Tode langweilen oder unnötig verwirren, falls du kein weiterführenderes Interesse hieran hast. :)

Gruß,
Adam
 
Hallo Adam,

du hast mir hier sehr gut weitergeholfen, der OOP-Ansatz interessiert mich schon -> ich habe das auch schon etwas reingeschnuppert.

Ich hätte diesbezüglich vorerst noch eine Frage, welcher Unterschied besteht zu
_proto_ -> das habe ich irgendwo auch schon gesehen.

Zu keens Hinweis -> wieso fällt prototyp in AS 2 weg -> ändert sich der OOP Ansatz eher in Richtung OOP Java oder C?


Gruß
Georg
 
Genau so ist es. Sprachen wie Java wurden bei der Erweiterung von AS 1 als Vorbild genommen. Da ich mich noch nicht ausführlicher damit beschäftigt habe.. kann ich dir leider keine weiteren Informationen dazu geben.

Zum Thema prototype und __proto__ habe ich dir 2 Links besorgt.

#1 http://netsh217.apollon.net-build.de/modules.php?name=Tutorials&op=view_tut&themaid=28
#2 http://netsh217.apollon.net-build.de/modules.php?name=Tutorials&op=view_tut&themaid=29

Ob dies nun alles in AS 2 funktioniert, bzw. welche Änderungen es dazu gibt, kann ich dir leider auch nicht sagen.

-keen!
 
Für die Erklärung der __proto__-Eigenschaft muss ich ein kleines Stück weiter in OOP eindringen.

Wie oben bereits steht, ist __proto__ eine Eigenschaft - nämlich genau wie prototype eine Eigenschaft jeder Instanz im Film.
Im Gegensatz zu prototype, welches ein Container für die Eigenschaften und Methoden einer Klasse darstellt, ist __proto__ lediglich eine Referenz auf genau jenes zu checkende prototype-Objekt einer Instanz.
Eine Instanz muss nämlich nicht dem Regelfall folgen und jeweils die Methode aus dem prototype-Objekt der Mutterklasse ausführen, sondern kann genausogut das prototype-Objekt einer "Kuckucks"klasse verwenden, das hängt ganz allein von der Gestaltung der Eigenschaft __proto__ ab.


Ein Beispiel hierfür aus dem in diesem Falle allzuoft gewählten Vergleich einer Familie:

Eine jede Instanz ist Tochter einer Klasse, von der sie geboren wurde.
Diese Instanz bekommt auf ihren Lebensweg ein paar Hinweise von der Mutterklasse mit, diese Hinweis findet sie im prototype-Objekt der Mutterklasse, auf die sie jederzeit zugreifen kann.
Aber woher weiß die Instanz eigentlich, wer ihre Mutter ist und auf wessen prototype-Objekt sie zugreifen muss, wenn sie nicht weiter weiß?
Ganz richtig, hierfür bekommt die Instanz die Eigenschaft __proto__ mit auf den Weg.
Dort schlägt sie nach, wenn sie nicht weiter weiß und wird im Standardfall auf das prototype-Objekt der Mutterklasse verwiesen.
Ergo lautet also die vom System automatisch gesetzte Anweisung:
PHP:
Klasse.prototype.__proto__ = Klasse.prototype;
Sagt nämlich nichts anderes als "Schau bei deiner Mutter nach". :)

Die Eigenschaft __proto__ ist aber nicht schreibgeschützt und kann jederzeit durch Scripting-Hand modifiziert und überschrieben werden.
Was nun, wenn sie jemand auf das prototype-Objekt einer anderen Klasse setzt?
Schaue man nach...
PHP:
function Ekel() {}
Ekel.prototype.knutsch = function() {
	trace("Igitt! Ohne mich!");
}
// die Familie der Ekel knutscht nicht gerne :-)

function Casanova() {}
Casanova.prototype.knutsch = function() {
	trace("Schmatz!");
}
// die Familie der Casanovas hingegen knutscht sehr gerne

schnuckel = new Casanova(); // ein neuer Sohn der Casanovas wird geboren
schnuckel.__proto__ = Ekel.prototype; // der neugeborene Casanova-Sohn soll nicht die Gewohnheiten der Familie Casanova übernehmen sondern die der Familie Ekel
schnuckel.knutsch(); // und zack - hier der Test
Und siehe da - der Kleine lehnt trotz Casanova-Mutter dankend ab und schließt sich der Meinung von Familie Ekel an, da in seiner __proto__-Eigenschaft nicht das prototype-Objekt der Casanova-Klasse, sondern jenes der Ekel-Klasse referenziert wird. :)

Im folgenden noch eine winzige Zusammenfassung des "scoping chains" einer Instanz - also derjenigen Reihenfolge, die eine Instanz betrachtet, um eine gegebene Methode auszuführen oder eine gegebene Eigenschaft auszulesen:

- die Instanz sucht eine nur ihr selbst zugeordnete Methode instanz.methode (ist logisch oder?)
- existiert eine solche nicht, schaut sie in ihrer __proto__-Eigenschaft nach, welche sie auf ein entsprechendes anderes Objekt verweist, welches die Methode beinhalten könnte

Ich hoffe das Beispiel war irgendwie verständlich und nicht zu dämlich. :)
Bei Fragen - immerzu und her damit.

Gruß,
Adam
 
Zurück