PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Javascript: Vererbung



BlueJay
28-01-2010, 16:12
Hallo Leute,

Gegeben:
1. etliche Objekte, die Koordinaten repräsentieren und ihren Inhalt. Diese bewegen sich nicht

2. einige Objekte, die sich bewegen, platzen oder sonst was.

Nuja, Gruppe 1 wurde implementiert durch die Klasse sprite,
Gruppe 2 bekam zusätzlich eine "arttypische" Erweiterung" namens dagobert.

Die Gruppen wurden im hau-ruck-Verfahren mit Werten bestückt.

Problem:
Wenn man dabei wie in Wikipedia vorgegeben vergeht, ist es Essig mit der Sprite-Basis bei der Gruppe 2, d.h. alle Eigenschaften und Methoden der Klasse sprite sind im Objekt dago "undefined":


var obj=new Array(); for (i=0; i<maxobj; i++) obj[i]=new sprite(i);

// die Sache mit der Vererbung: ----------------------------
dagobert.prototype = sprite; // Basistyp
obj[0]=new dagobert();
// ---------------------------------------------------------
dago=obj[0]; // einfache Pointerübergabe



Diese hingegen arbeitet zumindest im Mozilla korrekt, sie unterscheidet sich nur in einem Wörtchen:


var obj=new Array(); for (i=0; i<maxobj; i++) obj[i]=new sprite(i);

// die Sache mit der Vererbung: ----------------------------
dagobert.prototype = new sprite; // Basistyp - hier steht das Zauberwort
obj[0]=new dagobert();
// ---------------------------------------------------------
dago=obj[0]; // einfache Pointerübergabe



Nun will ich nicht gerade wegen eines Wörtchens in dem Artikel herumwurschteln (bin kein Autor), aber es wäre nett, wenn das korrigiert werden könnte. Über Vererbung findet man sonst nur so Wischi-Waschi, bei dem man nicht weiss, warum es jetzt funktioniert hat oder nicht. ;)

Wäre auch nett, wenn dabei steht, warum es funktioniert.

so long,
BlueJay

WolleKK
03-02-2010, 23:50
Hi,
mit JS kannst du leider nicht wirklich OOP programmieren. Lies dir doch mal diesen Artikel durch
http://www.peterkropff.de/site/javascript/oop.htm

undefined
04-02-2010, 13:46
Hi,
mit JS kannst du leider nicht wirklich OOP programmieren. Lies dir doch mal diesen Artikel durch
http://www.peterkropff.de/site/javascript/oop.htm
Naja - Also viel von OOP hat er auch nicht verstanden! Weil seine Ausführungen im Kapitel (Öffentliche Methoden und Eigenschaften) nicht stimmen.
Eine Methode innerhalb einer Klasse kann ohne weiteres auf private Variablen und Methoden zugreifen, das ist z.B.: C++ und anderen Sprachen auch nichts anderes. Es geht hier um Kapselung nach außen und das wird hier gewährleistet. Er sollte sich auch nicht auf PHP5 beziehen, das ist ein absolut schlechtes Beispiel für OOP ;)

panzi
07-02-2010, 03:29
Hab nur kurz drübergeschaut, aber der scheint auch nicht kapiert zu haben wozu Closures gut sind und hält die nur für eine Art der Kapselung. Du kannst getrost alles vergessen was er unter "Zugriffsrechte" geschrieben hat. Das ist völliger Humbug. Lerne lieber nicht mit diesem Tutorial, der hat JavaScript einfach nicht kapiert (dessen Scoping und Closures).

BlueJay
13-02-2010, 15:03
Hm, sooo unrecht scheint der Mann nicht zu haben.

Immerhin würge ich im ersten Beispiel dem dagobert eine Konstruktorfunktion unter, da kommt es zu den von ihm beschriebenen undefines. Wenn wirklich gar nichts gesehen wird, bricht die Javascript-Verarbeitung ab. (Firebug unterscheidet da sehr fein.)
Beim 2. Beispiel bekommt dagobert einen Pointer verpasst, und die Sache löppt (bei P.Korff heisst der Behelfspointer self, etwas dumm gewählt).

In der letzten Version scheint er einige Fehler überarbeitet zu haben. Aber das Ganze ist mir doch noch etwas zu kraus! Jedenfalls stimme ich mit ihm überein, dass man noch an der OOP herumarbeitet (wurschteln wollte ich jetzt nicht sagen).

Was Closures angeht, die haben mit bei der Timeout-Programmierung bisher nur Beinchen gestellt, ich hasse die Dinger!

BlueJay
24-02-2010, 22:42
so, ich nochmal.

Es gab nach einigen Versuchen etwas Licht im Dunkel der Vererbung:
Basisklasse ist chip, Klasse cursor ist eine Erweiterterung der Klasse chip mit einigen Extras.

Das untenstehende funktionierende Beispiel generiert ein Objekt der Klasse chip mit den Eigenschaften (Layers, Bildnamen) der Kennung 27, dieses Objekt ist der Prototype, von dem die Klasse cursor erbt.
Fazit: es wird nicht von einer Klasse, sondern von einem Objekt geerbt - Javascript halt.

crsr ist dann der Chip, den man durch die Gegend schubsen kann.



// die Sache mit der Vererbung: ----------------------------------------------------------------
cursor.prototype=new chip(maxchips); // Basistyp mit Vorbelegung 27, generiert aus Objekt
crsr=new cursor(); // der komplette Cursor
// ---------------------------------------------------------------------------------------------

function cursor()
{ this.id=maxchips;
this.on=function() { document.getElementById(this.lay).style.visibility ='visible'; aktiv=true; }
this.off=function() { document.getElementById(this.lay).style.visibility ='hidden'; aktiv=false; }
this.set_typ=function(nr) { this.typ=nr; document.images[this.bild].src=ima[nr].src; }
this.move=function(ix,iy) // mitte
{ var xx=ix-size/2,yy=iy-size/2; // spritestart
if (xx>=ofx) if (xx<=ofx+0.5*size*xmax) if (yy>=ofy) if (yy<=0.75*size*ymax) // Bewegungsbereich
{ this.x=xx; this.y=yy;
document.getElementById(this.lay).style.top=yy;
document.getElementById(this.lay).style.left=xx;
}
}
}

function chip(id)
{ this.id=id;
this.lay='l_'+this.id; // DOM-Layer-Id
this.bild='i'+this.id; // DOM-Bildname
this.typ=this.id;
this.x=tx;
this.y=ty;
this.z=this.id+2;
this.offen=false;
...
}


Über andere Wege habe ich keine gescheite Initialisierung hinbekommen.

Sollte ich auf dem Holzweg sein, bitte korrigieren!

so long,
BlueJay