[ascoders] Re: OOP Frage?

tja, das stimmt leider. die _alpha eigenschaft wird nicht gesetzt. ich hab mal diverse tests gemacht und hoffe ein bisschen licht auf die sache werfen zu können [vorsicht, sehr lang]:


ein bestehendes objekt kann man nur von einer klasse erben lassen indem man die __proto__ eigenschaft benutzt, sonst werden die eigenschaften des objektes gelöscht.


// eine einfache klasse:
MeineKlasse = function() {
        trace('neue instanz der klasse "Meine Klasse" erstellt.')
        this.einwert = 10;
}
MeineKlasse.methode = function () {
        trace("methode von MeineKlasse aufgerufen.")
}

// ein einfaches objekt:
meinObjekt = {};
meinObjekt.wert = "hallo welt";

wenn ich jetzt einfach
meinObjekt = new MeineKlasse();
mache, dann werden alle eigenschaften von meinObjekt gelöscht und mit den eigenschaften von MeineKlasse.prototype überschrieben.


anstattdessen benutze ich die __proto__ eigenschaft des objektes:
meinObjekt.__proto__ = new MeineKlasse();

das objekt hat jetzt die alten eigenschaften (wert) und die neuen der klasse (einwert, methode) stehen auch zur verfügung.



und das funktioniert auch mit movieclips:
MeineKlasse = function() {
        trace('neue instanz der klasse "Meine Klasse" erstellt.')
        this.einwert = 10;
}
MeineKlasse.prototype = new MovieClip();
MeineKlasse.methode = function () {
        trace("methode von MeineKlasse aufgerufen.")
}
meinMovieClip.__proto__ = new MeineKlasse();

meinMovieClip stehen jetzt die eigenschaften der klasse (einwert, methode) zur verfügung. es ist auch möglich, eigenschaften des mcs mit methoden (von der klasse geerbt) zu verändern. folgende methode, in der klassendefinition definiert, funktioniert:
MeineKlasse.prototype.bewegen = function() {
this._x += 10;
}


aber in dem beispiel von peter wird aber die _alpha eigenschaft im konstruktor nicht gesetzt! die eigenschaft "einwert", in der konstruktorfunktion meines beispiels gesetzt, lässt sich aber abrufen. die ursache dafür ist folgende:

mit
meinMovieClip.__proto__ = new MeineKlasse();
wird der konstruktor nicht auf meinMovieClip, sondern auf meinMovieClip.__proto__ angewandt. ist ja offensichtlich, aber wirklich wichtig.
die eigenschaften, die die konstruktorfunktion setzt, landen nämlich folglich in meinMovieClip.__proto__.


beispiel:
meinMovieClip.einwert // in der konstruktorfunktion der klasse gesetzt
existiert eigentlich garnicht in meinMovieClip, sondern in
meinMovieClip.__proto__.einwert


diese eigenschaften lassen sich direkt im bereich von meinMovieClip abrufen, weil der AS interpreter nach eigenschaften in der __proto__ eigenschaft sucht, wenn er sie nicht im objekt findet. es funktioniert auch mit methoden, die eine eigenschaft der instanz setzen, weil die funktionen (auch über den umweg __proto__) im bereich der instanz ausgeführt werden.

soweit eigentlich kein problem, aber this._alpha landet leider auch in meinMovieClip.__proto__. und da wird es halt nicht ausgewertet. um das an peters beispiel klarzumachen:

ObjectMc = function(){this._alpha = 50;};
ObjektMc.prototype = new MovieClip();
peter.__proto__ = new ObjectMc();

trace(peter.__proto__._alpha); // 50



die gute nachricht: es gibt einen weg, auch den konstruktor auf ein bestehendes objekt anzuwenden:

// klassendefinition:
ObjectMc = function(){
this._alpha = 50;
}
ObjektMc.prototype = new MovieClip(); // *vor* definition der methoden, sonst sind die ja wieder futsch
ObjectMc.prototype.setpos = function(){
this._x = 100;
this._y = 100;
}


peter.__proto__ = ObjektMc.prototype; // methoden zur verfügung stellen
ObjektMc.apply(peter); // konstruktor aufrufen





ich hoffe das hilft. mir sind jedenfalls gerade eine menge dinge klargeworden :-)



timo s.


------------------------------------------------------
Archiv   : http://www.freelists.org/archives/ascoders/
Optionen : http://www.freelists.org/list/ascoders
------------------------------------------------------

Other related posts: