[ascoders] Re: OOP Frage?
- From: timo stamm <t.stamm@xxxxxxxxxx>
- To: ascoders@xxxxxxxxxxxxx
- Date: Tue, 22 Oct 2002 22:06:50 +0200
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
------------------------------------------------------
- References:
- [ascoders] AW: Re: AW: Re: AW: AW: AW: OOP Frage?
- From: Jursa, Jan (init)
Other related posts:
- » [ascoders] OOP Frage?
- » [ascoders] Re: OOP Frage?
- » [ascoders] Re: OOP Frage?
- » [ascoders] Re: OOP Frage?
- » [ascoders] Re: OOP Frage?
- » [ascoders] OOP Frage
- » [ascoders] Re: OOP Frage
- » [ascoders] Re: OOP Frage
- » [ascoders] Re: OOP Frage
- » [ascoders] Re: OOP Frage
- » [ascoders] Re: OOP Frage
- » [ascoders] Re: OOP Frage
- » [ascoders] Re: OOP Frage
- » [ascoders] Re: OOP Frage
- » [ascoders] Re: OOP Frage
- » [ascoders] Re: OOP Frage
- » [ascoders] Re: OOP Frage
- » [ascoders] Re: OOP Frage
- » [ascoders] Re: OOP Frage
- » [ascoders] Re: OOP Frage
- » [ascoders] Re: OOP Frage
- » [ascoders] Re: OOP Frage
- » [ascoders] Re: OOP Frage
- [ascoders] AW: Re: AW: Re: AW: AW: AW: OOP Frage?
- From: Jursa, Jan (init)