Anzeige:
Ergebnis 1 bis 6 von 6

Thema: Javascript: Vererbung

  1. #1
    Registrierter Benutzer Avatar von BlueJay
    Registriert seit
    27.08.2004
    Beiträge
    825

    Javascript: Vererbung

    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":
    Code:
    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:
    Code:
    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
    Eigentlich ganz einfach, wenn man's weiss!

  2. #2
    Registrierter Benutzer
    Registriert seit
    02.01.2010
    Beiträge
    10
    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

  3. #3
    Registrierter Benutzer Avatar von undefined
    Registriert seit
    01.03.2004
    Beiträge
    1.255
    Zitat Zitat von WolleKK Beitrag anzeigen
    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
    Geändert von undefined (04-02-2010 um 14:49 Uhr)
    mfg undefined
    --
    Undefined Behavior (undefiniertes Verhalten) bedeutet meistens etwas ungültiges.
    xhtml Debugger

  4. #4
    Registrierter Benutzer Avatar von panzi
    Registriert seit
    05.05.2001
    Ort
    Kottingbrunn
    Beiträge
    609
    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).
    Intel Core 2 Duo CPU 2.66GHz; Nvidia GeForce 8 8800 GTS; 4GB RAM; Fedora 12; KDE-testing

  5. #5
    Registrierter Benutzer Avatar von BlueJay
    Registriert seit
    27.08.2004
    Beiträge
    825
    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!
    Eigentlich ganz einfach, wenn man's weiss!

  6. #6
    Registrierter Benutzer Avatar von BlueJay
    Registriert seit
    27.08.2004
    Beiträge
    825
    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.


    Code:
    // 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
    Eigentlich ganz einfach, wenn man's weiss!

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •