Uschi Renziehausen: Begriffschaos im Kopf: Objekt und Instanz

Hallo liebe Leute,

ich versuche gerade JS zu lernen, indem ich beschreibe, was ich geskriptelt habe und stelle dabei, fest, es funktioniert zwar, aber ich kann nicht beschreiben, warum.

Es gibt ein Objekt namens images, das ist vorgefertigt. Wenn ich nun ein Bildchen in meine Datei einbinde,

<img src="bildchen.gif" height="10" width="10" name="blubber">

ist das dann ein Objekt oder die Instanz eines Objekts images, und worin liegt der Unterschied, und was wäre dann eine Klasse?

Ich habe aus Selfhtml gelernt, daß die images eines Dokuments vom Browser als Array behandelt werden.
Also Array == normale Variablen oder Objekte, je nachdem, was drin ist?

Wär lieb, wenn ihr mich aufklären könntet :)

Uschi

  1. Ein Objekt ist eine Instanz einer Klasse...

    Dieses hier wäre so eine Art 'Klassendefinition':

    function testobjekt(wert)
    {
    this.speicher=wert;
    }

    Mittels

    g=new testobjekt(3);
    f=new testobjekt(4);

    erzeuge ich eine zwei neue Instanzen der Klasse "testobjekt", zwei neue Objekte namens g und f.

    (Ich hoffe nur, ich habe mich nicht selbst in der Objektorientierungslosigkeit verrannt.)

    Daß die Grafiken in einer HTML-Seite sowohl über einen Array als auch über Namen ansprechbar sind, ist dabei eigentlich höchst irrelevant und im Prinzip überhaupt nicht verwirrend, freu' Dich besser, daß beides geht.

    Bio

  2. Hallo Uschi,

    ich versuche gerade JS zu lernen, indem ich beschreibe, was ich geskriptelt habe und stelle dabei, fest, es funktioniert zwar, aber ich kann nicht beschreiben, warum.

    Du hast vielleicht Probleme <g> - andere waeren froh, sie haetten solche ;-)

    Es gibt ein Objekt namens images, das ist vorgefertigt. Wenn ich nun ein Bildchen in meine Datei einbinde,
    <img src="bildchen.gif" height="10" width="10" name="blubber">
    ist das dann ein Objekt oder die Instanz eines Objekts images, und worin liegt der Unterschied, und was wäre dann eine Klasse?

    Jedes <img>-Tag in HTML erzeugt aus Sicht von JavaScript eine Instanz des images-Objekts. Ein Objekt ist etwas Abstraktes, nur die Idee von etwas. Eine Objektinstanz ist eine konkrete Realisierung dieser Idee. Du kannst sagen: es gibt Grafiken in HTML. Das ist aber nur ideell. Erst wenn du ein korrekt notiertes <img>-Tag in einer HTML-Datei hast, wird daraus eine tatsaechliche Grafikreferenz. Und in dem Moment wird eben eine Realisierung, sprich eine Instanz des zugehoerigen JavaScript-Objekts erzeugt. Instanzen eines JavaScript-Objekts kannst du allerdings nicht nur durch Notation von HTML-Tags erzeugen, sondern auch innerhalb von JavaScript selber. Wenn du z.B. so was hast wie:
    Bild = new Image();
    Bild.src = "datei.gif";
    dann erzeugst du allein mit Hilfe von JavaScript eine neue Instanz des images-Objekts. Da es sich um ein Objekt handelt, das kompatibel ist zu solchen Objekten, die durch <img>-Tags in HTML erzeugt werden, kannst du beide mischen, sprich: du kannst eine in HTML notierte Ursprungsgrafik durch eine in JavaScript als Objekt definierte neue Grafik dynamisch austauschen.

    Sicher werden dir die richtigen Programmierer das alles viel genauer erklaeren koennen. Die Frage ist nur, ob du es dann verstehst ;-)

    viele Gruesse
      Stefan Muenz

    1. Sicher werden dir die richtigen Programmierer das alles viel genauer erklaeren koennen.

      Hm - Didaktik ist meines Wissens kein Pflichtfach bei der Ausbildung eines Programmierers ...

      Die Frage ist nur, ob du es dann verstehst ;-)

      Eben. ;-)))

    2. Hi Stefan, du bist ein Goldstück,

      Du hast vielleicht Probleme <g> - andere waeren froh, sie haetten solche ;-)

      Meistens habe ich leider auch das Problem "funzt nich", und genau das wollte ich durch die Beschreiberei mal abstellen.
      Der Punkt ist doch der: Leute wie ich verstehen  Programmieranleitungen meist nicht ganz. Damit sie dann vorwärtskommen, produzieren sie  ein Trial und noch 'n Error im Quadrat bis es endlich funktioniert. Dazwischen liegen, sobald es ein bischen komplexer wird, soviele Änderungen und vergessene Semikola, daß zumindest ich nicht mehr weiß, wie ich denn da nun hingekommen bin. Mit anderen Worten, beim nächsten Mal geht das Elend von vorne los. Der Beschreibungsversuch zwingt einen jedoch dazu, die eigenen Scripteleien zu verstehen und zu evaluieren. Der Rest ist dann Vokabeln lernen.

      Dein Erklärungsansatz ist klasse und für Leute wie mich unmittelbar verständlich, weil er nolens volens auf etwas zurückgreift, womit sich die meisten Geisteswissenschaftler irgendwann mal beschäftigt haben: Erkenntnistheorie, und zwar im vorliegenden Fall platonische Ideenlehre. Vielleicht kann man daraus mal was machen. Ein Problem in der Programmierdidaktik ist nämlich sicherlich, daß immer davon ausgegangen wird, die Adressaten der Handbücher seien fit in Mathe. War ich nie und bin ich -- zu meinem Bedauern -- auch jetzt noch nicht. Programmierern -- sieh dir Roland oben an, fällt als Beispiel immer als erstes sowas wie Streckenberechnung ein. Was meinst du, wie lange ich gebraucht habe, um zu realisieren, daß der Variablenname i ein solcher ist, und nicht etwa integraler Bestandteil einer for-Schleife.        
      Nun habe ich aber doch noch ein paar Rückfragen:

      Du kannst sagen: es gibt Grafiken in HTML. Das ist aber nur ideell.
      Erst wenn du ein korrekt notiertes <img>-Tag in einer HTML-Datei hast, wird daraus eine
      tatsaechliche Grafikreferenz. Und in dem Moment wird eben eine Realisierung, sprich eine
      Instanz des zugehoerigen JavaScript-Objekts erzeugt.

      Wieso erstmal eine Referenz und dann erst eine Instanz des Objekts?
      Kann man sagen, daß es sich bei

      Bild = new Image();
      Bild.src = "datei.gif";

      um die Instanz eines Objekts handelt, auf die noch nicht Bezug genommen wurde?

      dann erzeugst du allein mit Hilfe von JavaScript eine neue Instanz des images-Objekts.
      Da es sich um ein Objekt handelt, das kompatibel ist zu solchen Objekten, die durch <img>-Tags
      in HTML erzeugt werden, kannst du beide mischen:

      Die Kompatibilität wird in diesem Falle durch Image() erzeugt.

      Wenn ich nun aber ein ganz Objekt baue, dann geht das laut selfhtml über eine Funktion.
      Wenn ich jetzt nun sage

      function friends(vorname, nachname, alter){
      this.vorname = vorname;
      this.nachname = nachname;
      this.alter = alter;
      }

      ist das einzige, was das Browser-Universum bereits kennt, die Idee einer Funktion (Objekt), von der ich nunmehr
      ein reales Exemplar (i.e. Instanz) namens "friends" gekreiert habe. Aber was habe ich erzeugt, wenn ich irgendwo weiter unten schreibe

      guterFreund =  new friends("Nepomuk", "Schnibbeldick", "103");

      Eine Instanz der Idee function oder eine Instanz der Instanz friends? Oder beides?
      Irgendwo habe ich auch mal die Notierung new Object() gelesen, aber in Selfhtml kann ich das nicht finden.
      Gibt es irgendwo eine Liste, was hinter new an Vorgefertigtem alles kommen kann.

      Sicher werden dir die richtigen Programmierer das alles viel genauer erklaeren koennen. Die Frage ist nur, ob du es dann verstehst ;-)

      <g> Nein. Ich versuche mich jetzt mal an Rolands Antwort. Wenn ich da zwei Stunden draufgeguckt habe, bin ich wahrscheinlich komplett plemplem.
      Im übrigen wäre ich auch für eine Aufnahme in die Forumsauslese, aber vielleicht so, daß auch sone wie ich das mal raffen. Vielen Dank jedenfalls erstmal,

      Liebe Grüße, Uschi

      Und noch was, irgendjemand möge dem Valligator ein paar Zähnchen ziehen. Ohne Umbruch bringt wenig Punkte. Haust Du ihm von mir aufs Haupt? Ganz fest?

      1. Hallo Uschi,

        Erkenntnistheorie, und zwar im vorliegenden Fall platonische Ideenlehre.

        Gut erkannt - den Platon hatte ich tatsaechlich im Hinterkopf dabei ;-)

        Ein Problem in der Programmierdidaktik ist nämlich sicherlich, daß immer davon ausgegangen wird, die Adressaten der Handbücher seien fit in Mathe.

        Das ist wahr. Denn meistens kommen oder kamen die typischen Programmierer eben auch aus dieser Ecke, und wer in die Tiefen der Programmierung einsteigt, wird um algorithmenorientiertes Denken auch nicht drumherum kommen. Aber gerade heute, wo Millionen Leute im Zuge der Webseitenerstellung so am Rande ein wenig mit Programmierung in Beruehrung kommen, ist es tatsaechlich wichtig, auch andere Zugaenge zu dieser Materie zu schaffen.

        Was meinst du, wie lange ich gebraucht habe, um zu realisieren, daß der Variablenname i ein solcher ist, und nicht etwa integraler Bestandteil einer for-Schleife.

        Ich weiss - das sind jene "Selbstverstaendlichkeiten", die in fast keiner Doku zu Programmiersprachen-Doku drinstehen.

        Kann man sagen, daß es sich bei

        Bild = new Image();
        Bild.src = "datei.gif";
        um die Instanz eines Objekts handelt, auf die noch nicht Bezug genommen wurde?

        Sagen wir so: mit dem ersten Befehl wird die Objektinstanz erzeugt. Mit dem zweiten Befehl wird bereits darauf Bezug genommen. Aber wenn man nun sagt:

        document.images[0].src = Bild.src;

        Dann wird da auch auf eine Instanz des Image-Objekts Bezug genommen, aber auf eine, die nicht mit JavaScript erzeugt wurde, sondern bereits da ist, weil es eine Grafik in der HTML-Datei gibt, die mit <img src="irgendwas.gif"> notiert ist.

        Aber was habe ich erzeugt, wenn ich irgendwo weiter unten schreibe
        guterFreund =  new friends("Nepomuk", "Schnibbeldick", "103");
        Eine Instanz der Idee function oder eine Instanz der Instanz friends? Oder beides?

        Das seltsame Konstrukt mit dem this.name = name ist wirklich ziemlich platonisch. Es ist halt die programmiersprachentechnische Konvention, um Objekte als solche zu deklarieren. Der JavaScript-Interpreter weiss dadurch, dass es fuer ihn ein Objekt mit diesem Namen (friends) gibt, das verschiedene Eigenschaften hat (vorname, nachname, alter). Mit:
        guterFreund =  new friends("Nepomuk", "Schnibbeldick", "103");
        erzeugst du eine Instanz dieses Objekts. Genauso wie du mit:
        Bild = new Image()
        eine Instanz eines Objekts erzeugst. Der Unterschied ist nur, dass das Image-Objekt in JavaScript bereits vordefiniert ist, waehrend du dir das friends-Objekt mit dem seltsamen Konstrukt selber definiert hast.

        Gibt es irgendwo eine Liste, was hinter new an Vorgefertigtem alles kommen kann.

        Nun ja, ich vreweise dich mal kleinlaut auf <../../tec.htm> und bitte dich, einfach mal alle Seiten dort zu oeffnen und mal von allen Dateien das zu lesen, was bei den "Hinweisen zum Objekt" jeweils steht. Dann wirst du langsam drauf kommen ;-)

        Und noch was, irgendjemand möge dem Valligator ein paar Zähnchen ziehen. Ohne Umbruch bringt wenig Punkte. Haust Du ihm von mir aufs Haupt? Ganz fest?

        Dafuer ist unser PAF zustaendig ;-)

        viele Gruesse
          Stefan Muenz

        1. Hi Stefan und Uschi,

          Erkenntnistheorie, und zwar im vorliegenden Fall platonische Ideenlehre.

          Mmh, sagt mir jemand, was Erkenntnistheorie ist?

          Ein Problem in der Programmierdidaktik ist nämlich sicherlich, daß immer davon ausgegangen wird, die Adressaten der Handbücher seien fit in Mathe.

          Das ist mir auch schon aufgefallen. Mir ist aber trotzdem nichts besseres eingefallen. Beispiele aus dem realen Leben sind meist viel zu komplex, als dass man sie fuer eine einfache Einfuehrung heranziehen koennte. Und mal ehrlich, wer sich mit OOP beschaeftigt, dem sollte es an so ein bisschen Allgemeinwissen nicht mangeln.

          Warum ich eigentlich hier antworte:

          Kann man sagen, daß es sich bei

          Bild = new Image();
          Bild.src = "datei.gif";
          um die Instanz eines Objekts handelt, auf die noch nicht Bezug genommen wurde?

          Image ist die (Objekt-)Klasse, Bild ist eine Instanz davon. Die Klasse ist die *Beschreibung* eines Typs von Ding, eine Instanz ist sozusagen die (bzw. eine) Existent-Werdung dieses Typs. Es gibt z.B. die Klassen Frau und Mann, und es gibt jeweils ca. 3 Mrd. Instanzen dieser Klassen auf der Erde. (Wow, das ist ein Weltbild! *g*)

          document.images[0].src = Bild.src;

          Dann wird da auch auf eine Instanz des Image-Objekts Bezug genommen, aber auf eine, die nicht mit JavaScript erzeugt wurde, sondern bereits da ist, weil es eine Grafik in der HTML-Datei gibt, die mit <img src="irgendwas.gif"> notiert ist.

          Yepp. Der Browser erzeugt beim Einlesen der Datei automatisch entsprechende Instanzen in der JS-Welt.

          Aber was habe ich erzeugt, wenn ich irgendwo weiter unten schreibe
          guterFreund =  new friends("Nepomuk", "Schnibbeldick", "103");
          Eine Instanz der Idee function oder eine Instanz der Instanz friends? Oder beides?

          friends ist die Klasse, guterFreund eine Instanz davon.

          Das seltsame Konstrukt mit dem this.name = name ist wirklich ziemlich platonisch. Es ist halt die programmiersprachentechnische Konvention, um Objekte als solche zu deklarieren.

          Ja, leider keine besonders gluecklich gewaehlte Syntax.

          Der JavaScript-Interpreter weiss dadurch, dass es fuer ihn ein Objekt mit diesem Namen (friends) gibt, das verschiedene Eigenschaften hat (vorname, nachname, alter). Mit:
          guterFreund =  new friends("Nepomuk", "Schnibbeldick", "103");
          erzeugst du eine Instanz dieses Objekts. Genauso wie du mit:
          Bild = new Image()
          eine Instanz eines Objekts erzeugst. Der Unterschied ist nur, dass das Image-Objekt in JavaScript bereits vordefiniert ist, waehrend du dir das friends-Objekt mit dem seltsamen Konstrukt selber definiert hast.

          Nennt mich von mir aus einen Theoretiker, aber hier muss ich auf den Begrifflichkeiten rumreiten: Wenn wir uns schon am Klassen-vs.-Instanzen-Modell festhalten, dann muessen wir eben zwischen Klasse einerseits und Instanz andererseits unterscheiden. Der Begriff Objekt steht aber nicht stellvertretend fuer Klasse, sondern fuer Instanz, zumindest ueberall, wo ich es bisher gelesen habe (ein klare Definition habe ich dazu noch nicht gefunden).

          <WARNING WHAT_OF="This part is very confusing. You migth want to skip it.">

          Man findet in der JS-Welt oft Begriffe wie das "Image-Objekt". Hier muesste man unterscheiden (muesste, weil das JS-Modell nun eben nicht klassenbasiert ist). Den Satz "Bild ist ein Image-Objekt" muesste man interpretieren als "Bild ist ein Objekt (== Instanz) der Klasse Image". "IE kennt das Image-Objekt erst seit Version 4" ist aber schlichtweg falsch, denn genaugenommen kennt er die "Image-Klasse" seitdem.

          Aber: JS ist wie gesagt prototypen-basierend, d.h. es macht die Unterscheidung Klasse-Instanz gar nicht. Es gibt hier lediglich eine "Constructor"-Funktion, die ein Objekt mit einem initial set of properties (anfaengliche Menge von Eigenschaften) zusammenbaut. Alles was diese Funktion (friends und Image in obigen Beispielen) zusammenbaut, sind dann einfach Objekte (guterFreund und Bild). Diese Objekte sind sozusagen nach einem Prototyp gebaut worden, koennen sich danach aber veraendern. (Das geht bei Instanzen von Klassen nicht.)

          (But that's by far not the whole story. Find that at http://developer.netscape.com/docs/manuals/js/client/jsguide/obj2.htm.)

          </WARNING>

          Gibt es irgendwo eine Liste, was hinter new an Vorgefertigtem alles kommen kann.

          Etwas umfassender als Selfhtml ist das Original, die Netscape JS Referenz: http://developer.netscape.com/docs/manuals/js/client/jsref/index.htm (1. Kapitel mit dem Pfeil aufklappen). Microsoft-spezifische Dinge stehen dort aber natuerlich nicht drin.

          Im übrigen wäre ich auch für eine Aufnahme in die Forumsauslese, aber vielleicht so, daß auch sone wie ich das mal raffen.

          Dort aufgenommen wird das sowieso, weil ich zur Zeit fuer die Abteilung JS-Theorie zustaendig bin. *g* Du koenntest ja mal einen Ansatz posten, wie es fuer Dich verstaendlicher waere. Woher soll denn das so ein viel mehr in seinem Cyberspace lebender Programmierer auch wissen, ne? ;-)

          Und Uschi: Was soll das heissen, es liesst sich wie die Bildzeitung? *verwirrtsei*

          So long

          1. Hi Roland, high Stefan

            Mmh, sagt mir jemand, was Erkenntnistheorie ist?

            Hmh: Vielleicht so: Es geht dabei um das Verhältnis zwischen dem, was ist (dem Seienden), und dem, was wir durch die Vermittlung unserer Sinne und unserer davon zu unterscheidenden Vorstellungskraft davon wahrnehmen. Ich klamüsere das mal zusammen, weil ich denke, es ist gar nicht blöd, den browser als das universum zu bezeichnen, aber nicht mehr heute abend.

            Ein Problem in der Programmierdidaktik ist nämlich sicherlich, daß immer davon ausgegangen wird, die Adressaten der Handbücher seien fit in Mathe.

            Und mal ehrlich, wer sich mit OOP beschaeftigt, dem sollte es an so ein bisschen Allgemeinwissen nicht mangeln.

            OOP ist ein Mittel, kein Selbstzweck. Ich bedaure, wie gesagt, dass ich in Mathe nicht fit bin. Streckenberechnung ist im Übrigen etwas, was im realen Leben eines Landvermessers durchaus eine Rolle spielt. Im realen Leben von Sprachlehrerinnen kommt das allerdings nur seltener vor, da spielen eher Wörter und Strings eine Rolle. Allgemeingültig ist aber zum Beispiel, daß es auf eine Frage mehrere richtige, mehrere halbrichtige und viele falsche Antworten gibt, von denen einige voraussehbar sind. Je nachdem muß es eine unterschiedliche Rückmeldung geben.

            Bild = new Image();
            Bild.src = "datei.gif";

            Image ist die (Objekt-)Klasse, Bild ist eine Instanz davon. Die Klasse ist die *Beschreibung* eines Typs von Ding, eine Instanz ist sozusagen die (bzw. eine) Existent-Werdung dieses Typs. Es gibt z.B. die Klassen Frau und Mann, und es gibt jeweils ca. 3 Mrd. Instanzen dieser Klassen auf der Erde. (Wow, das ist ein Weltbild! *g*)

            Aha, nun arbeiten wir also mit Bindestrichen. Ich fühle mich im Übrigen ganz wohl als eine Instanz der Klasse Frau <g>.

            Aber was habe ich erzeugt, wenn ich irgendwo weiter unten schreibe
            guterFreund =  new friends("Nepomuk", "Schnibbeldick", "103");
            Eine Instanz der Idee function oder eine Instanz der Instanz friends? Oder beides?

            friends ist die Klasse, guterFreund eine Instanz davon.

            Das seltsame Konstrukt mit dem this.name = name ist wirklich ziemlich platonisch. Es ist halt die programmiersprachentechnische Konvention, um Objekte als solche zu deklarieren.

            Ja, leider keine besonders gluecklich gewaehlte Syntax.

            habe ich immer noch nicht gefressen, jedenfalls guckt es mich wieder an wie ein auto.

            Der Begriff Objekt steht aber nicht stellvertretend fuer Klasse, sondern fuer Instanz, zumindest ueberall, wo ich es bisher gelesen habe (ein klare Definition habe ich dazu noch nicht gefunden).

            Demnach ist der Begriff Objekt so übeflüssig wie ein Kropf, obwohl sich das ganze ObjektOrientierte Programmierung schimpft?

            Ich laß die Kompliziertheiten mal weg. Kann ich sagen: Einmal gesetzte Eigenschaften und Methoden einer Klasse sind unveränderlich. Damit ich mich nicht aufhänge, müssen die Eigenschaften und Methoden einer Klasse sich auf den kleinsten gemeinsamen Nenner aller darunter zu subsumierendenden Instanzen beschränken.
            Und das mache ich solange, bis alle möglichen Realitäten für meine jeweilen Konkreta gebaut sind?

            Etwas umfassender als Selfhtml ist das Original, die Netscape JS Referenz: http://developer.netscape.com/docs/manuals/js/client/jsref/index.htm (1. Kapitel mit dem Pfeil aufklappen). Microsoft-spezifische Dinge stehen dort aber natuerlich nicht drin.

            1 Kapitel mit Pfeil? hat das kapitel vielleicht einen Titel?:
            Hier das, was ich in Selfhtml gefunden habe:
            new Option(); tecbbdaa.htm
            new Image(); tecbbe.htm
            new Array(); tecc.htm
            new Boolean(); tecd.htm
            new Date(); tece.htm
            new Function(); tecf.htm

            Dort aufgenommen wird das sowieso, weil ich zur Zeit fuer die Abteilung JS-Theorie zustaendig bin. *g* Du koenntest ja mal einen Ansatz posten, wie es fuer Dich verstaendlicher waere. Woher soll denn das so ein viel mehr in seinem Cyberspace lebender Programmierer auch wissen, ne? ;-)

            Laß uns mal austesten, ob das mit der Ideenlehre funktioniert und dazu komplexere Beispiele aus verschiedenen Bereichen bauen.  Was heißt: laß uns. Versprechen kann ich lediglich, daß ich mir viel Mühe geben werde. Eigennutz ist natürlich überhaupt nicht dabei <g>.

            Und Uschi: Was soll das heissen, es liesst sich wie die Bildzeitung? *verwirrtsei*

            Armer Roland, was du nicht willst, dass man dir tu, das füg ...
            ich setze mich damit auseinander, aber so auf den ersten blick sind einfach zu viele rätsel offen.

            cia4now, uschi

            1. Re high

              Ein Problem in der Programmierdidaktik ist nämlich sicherlich, daß immer davon ausgegangen wird, die Adressaten der Handbücher seien fit in Mathe.

              Und mal ehrlich, wer sich mit OOP beschaeftigt, dem sollte es an so ein bisschen Allgemeinwissen nicht mangeln.
              OOP ist ein Mittel, kein Selbstzweck.

              Wie kommst Du auf Selbstzweck?

              Ich bedaure, wie gesagt, dass ich in Mathe nicht fit bin. Streckenberechnung ist im Übrigen etwas, was im realen Leben eines Landvermessers durchaus eine Rolle spielt. Im realen Leben von Sprachlehrerinnen kommt das allerdings nur seltener vor, da spielen eher Wörter und Strings eine Rolle.

              Willst Du Dich daran jetzt wirklich hochziehen? Nur soviel: In meinem Leben spielt solches Zeug auch keine Rolle. Wohl deshalb hatte ich meinen Text erst mit dem Begriff "Gerade" geschrieben, bis mir eingefallen ist, dass das was anderes ist.

              Image ist die (Objekt-)Klasse, Bild ist eine Instanz davon. Die Klasse ist die *Beschreibung* eines Typs von Ding, eine Instanz ist sozusagen die (bzw. eine) Existent-Werdung dieses Typs. Es gibt z.B. die Klassen Frau und Mann, und es gibt jeweils ca. 3 Mrd. Instanzen dieser Klassen auf der Erde. (Wow, das ist ein Weltbild! *g*)
              Aha, nun arbeiten wir also mit Bindestrichen.

              Was meinst Du mit Bindestriche?

              Das seltsame Konstrukt mit dem this.name = name ist wirklich ziemlich platonisch. Es ist halt die programmiersprachentechnische Konvention, um Objekte als solche zu deklarieren.

              Ja, leider keine besonders gluecklich gewaehlte Syntax.

              habe ich immer noch nicht gefressen, jedenfalls guckt es mich wieder an wie ein auto.

              Was nicht gefressen? Nur diese Syntax mit dem this? Oder gar nichts?
              Musst ja nicht gleich alles auf einmal kapieren. Ist ja auch nicht ganz wenig, wenn man noch nichts weiter damit zu tun hatte. Hauptsache erstmal das Gesamtbild baut sich langsam auf.

              Der Begriff Objekt steht aber nicht stellvertretend fuer Klasse, sondern fuer Instanz, zumindest ueberall, wo ich es bisher gelesen habe (ein klare Definition habe ich dazu noch nicht gefunden).

              Demnach ist der Begriff Objekt so übeflüssig wie ein Kropf, obwohl sich das ganze ObjektOrientierte Programmierung schimpft?

              Naja, etwas schnell geurteilt, aber kann schon sein. (Wenn man ueber sowas redet, spricht sich Objekt aber schon leichter aus als Instanz, findest Du nicht?)

              Ach ja, doch noch was gefunden. Weiss aber nicht, ob das einen Anspruch auf Gueltigkeit erheben kann (aber wie gesagt, anders kenne ich es auch nicht):
                  object
                  In object-oriented programming, a unique instance of a data structure
                  defined according to the template provided by its class. Each object
                  has its own values for the variables belonging to its class and can
                  respond to the messages (methods) defined by its class.
              http://foldoc.doc.ic.ac.uk/foldoc/foldoc.cgi?objects

              Ich laß die Kompliziertheiten mal weg. Kann ich sagen: Einmal gesetzte Eigenschaften und Methoden einer Klasse sind unveränderlich.

              Verstehe ich nicht, was meinst Du damit?

              Damit ich mich nicht aufhänge, müssen die Eigenschaften und Methoden einer Klasse sich auf den kleinsten gemeinsamen Nenner aller darunter zu subsumierendenden Instanzen beschränken.
              Und das mache ich solange, bis alle möglichen Realitäten für meine jeweilen Konkreta gebaut sind?

              Das ist die falsche Vorgehensweise, die zu schlechtem Design fuehrt (aber gut, das ist anfangs vielleicht eher nebensaechlich *g*). Du darfst nicht fragen, was fuer verschiedene Dinge kann ich so verstuemmeln, damit ich sie durch ein und dieselbe Klasse beschreiben kann. Sondern Du musst wissen, wie ein Ding aussieht, und das beschreibst Du dann einfach. Und wenn etwas wirklich anders aussieht, gehoert es wahrscheinlich nicht zur selben Klasse. (Aehem... "einfach". Das ist eigentlich das groesste Problem bei der ganzen Sache. Programmierer verbringen Wochen und Monate lediglich damit, darueber nachzudenken, wie ein Ding denn nun aussieht und was fuer Eigenschaften es hat.) (Leider wieder Mathe, aber es ist doch nun mal am einfachsten: Ich kann einen Punkt auch als Spezialfall einer Strecke betrachten, wobei Anfang und Ende an derselben Stelle sind und die Laenge ist dann Null. Ich koennte die beiden also in dieselbe Klasse zusammenstopfen. Aber das ist schlechtes Design. (Wobei ich so auf Anhieb auch nicht sagen kann, warum eigentlich. Dafuer braucht man dann eben ein Gefuehl.))

              Etwas umfassender als Selfhtml ist das Original, die Netscape JS Referenz: http://developer.netscape.com/docs/manuals/js/client/jsref/index.htm (1. Kapitel mit dem Pfeil aufklappen). Microsoft-spezifische Dinge stehen dort aber natuerlich nicht drin.

              1 Kapitel mit Pfeil? hat das kapitel vielleicht einen Titel?:

              Das 1. Kapitel erkennt man eigentlich daran, dass eine 1, optional gefolgt von einem Punkt, davor steht. Aber bitte, der Titel: "1. Objects, Methods, and Properties".

              Laß uns mal austesten, ob das mit der Ideenlehre funktioniert und dazu komplexere Beispiele aus verschiedenen Bereichen bauen.

              Leider beschraenkt sich mein Wissen ueber Platon darauf, dass er tot ist. Du muesstest dann also explizit ausfuehren, was diese Lehre beinhaltet.

              ich setze mich damit auseinander, aber so auf den ersten blick sind einfach zu viele rätsel offen.

              Das ist ja gut. Dann kannst Du ja entsprechende Fragen stellen. Wenn Du dagegen gar nichts gerafft haettest, kannst Du auch nicht fragen, und irgendjemand muesste sich ne andere Methode ausdenken, nochmal alles von vorne zu erklaeren.

              Bis dann

              1. Hallo,

                Jetzt gebe ich als viel zitierter Vertreter der Gattung "Programmierer" auch noch meinen Senf dazu.
                Schlimmer kann das Begriffschaos auch nicht mehr werden. ;-)

                Demnach ist der Begriff Objekt so übeflüssig wie ein Kropf, obwohl sich das ganze ObjektOrientierte Programmierung schimpft?

                Nein, da hilft ein Blick in die Entwicklung von OOP. Am Anfang gabs nur Objekte und ihren Instanzen. Man hat sich seine Objekte in eine Programmiersprache selber gebastelt in dem man eine Datenstuktur definiert hat und seine Methoden in Form von Funktionen und Proceduren geschrieben hat.

                Durch das Prinzip der Kapselung -Daten und Code als logische Einheit zu sehen- und das Prinzip der Vererbung -hierarchische Strukturen mit inhaltlichen Beziehungen der Objekte untereinander- ist ein solcher Code sehr universel. Ein wildfremder kann dein Objekte verwenden ohne zu wissen was genau dahinter steckt. Er muß nur die Namen der Objekte und Methoden kennen.

                Also hat man angefangen den Programmier-Sprachen vorgefertigte  Objektdefinitionen beizulegen das sparte den Programmierern ne Menge arbeit - die Klassen (!!!!) waren geboren.

                Als das ganze dann in Mode kam hat man begonnen Betriebssystemen, Anwenderprogrammen und und und... eine objektorientierte Schnittstelle zu verpassen in dem man die vorhandenen mehr oder hierarchischen Strukturen auf ein hierarchisches System von Klassen übertragen hat. So kann man z.B. an HTML "andocken" und es programmieren.

                Da aber HTML eigentliche nicht hierachisch ist sind einige Verrenkungen und unlogisch erscheinende Konstruktionen (wie sie in der Syntax von JS aufstossen) notwendig um das hinzukriegen.

                Deshalb sind JavaScript-Beispiele auch nicht besonders gut geeignet um das objektorientierte Prinzip zu verstehen.

                ------------------

                Ich laß die Kompliziertheiten mal weg. Kann ich sagen: Einmal gesetzte Eigenschaften und Methoden einer Klasse sind unveränderlich. Damit ich mich nicht aufhänge, müssen die Eigenschaften und Methoden einer Klasse sich auf den kleinsten gemeinsamen Nenner aller darunter zu subsumierendenden Instanzen beschränken.

                (streiche Instanzen, setzte Klassen dann stimmt‚s ein Instanz ist nur das Abbild eine Klasse)

                Und das mache ich solange, bis alle möglichen Realitäten für meine jeweilen Konkreta gebaut sind?

                Genau das ist die ideale Vorgehensweise beim erstellen einer Objekt-Hierarchie. Man beginnt mit möglichst allgemeingültigen Objekt und erzeuge daraus durch vererben und ergänzen immer differenziertere und konkretere Objekte. Ein Baum von Objekt entsteht.

                Wenn man eine Objektstruktur auf etwas vorhandes aufgepfropft werden soll geht das leider nicht so schön. Die einzelnen Andockpunkte / Objekte sind ja schon vorgegeben und der Baum dazu muss machmal ganzschön krumm "wachsen".

                Wie funktioniert nun das "aufpfropfen": Wir machen aus dem IMG-Tag ein Objekt Image mit den Eigenschaften Breite, Höhe... und Methoden um diese zu verändern. Jetzt haben wir eine Objekt aber noch lange keine objektorientierte Struktur. Für eine objektorientierte Struktur bräuchten wir weitere Objekt die mit Image inhaltlich "verwandt" sind und durch Verallgemeinerung oder Spezialisierung daraus hervorgehen. Tags die in dieser Weise zu IMG passen gibts in HTML aber nicht, braucht ja auch keiner.

                Aber eine Image ist immer innerhalb eines Dokumentes. Also könnte man sagen document ist der Vorfahre von Image und Windows der Vorfahre von document (so is es ja auch). Das ist zwar immer noch keine inhaltliche objektorientierte Struktur aber immerhin eine hierachische Struktur und damit ein guter Kompromiss um eine Verbindung zwischen der klassischen HTML-Welt und der objektorientern Welt herzustellen.

                So, genug doziert und philosophiert
                Gute Nacht
                Stephan

      2. Der Beschreibungsversuch zwingt einen jedoch dazu, die eigenen Scripteleien zu verstehen und zu evaluieren. Der Rest ist dann Vokabeln lernen.

        Das ist eine ganz wichtige Erkenntnis, die vielen Lesern dieses Forums gar nicht oft genug gesagt werden kann: Sorgfältiges Posten ist nicht nur hilfreich für den Antwortenden, sondern auch für den Fragesteller!

        Ein Problem in der Programmierdidaktik ist nämlich sicherlich, daß immer davon ausgegangen wird, die Adressaten der Handbücher seien fit in Mathe. War ich nie und bin ich -- zu meinem Bedauern -- auch jetzt noch nicht.

        Das kommt darauf an, was Du unter "Mathe" verstehst.

        Ich habe als Informatiker praktisch nie irgendwas von dem gebraucht, was ich z. B. in Analysis gelernt hatte - aber die Denkweise, die bei Algebra oder Wahrscheinlichkeitstheorie vermittelt wird, hilft auch beim Programmieren sehr.
        Ersetze "Mathe" durch "Abstraktionsvermögen", dann stimme ich Dir zu.

        Was meinst du, wie lange ich gebraucht habe, um zu realisieren, daß der Variablenname i ein solcher ist, und nicht etwa integraler Bestandteil einer for-Schleife.

        Hm, das kommt auf die Beschreibung der Sprache an.

        Wenn Du aus Beispielen lernst, gehst Du genau hier in die Falle. Liest Du aber gleich die formale Sprachbeschreibung in Backus-Naur-Form etc., dann ist dieser Punkt sofort klar. (Dafür muß man natürlich erst mal BNF lernen, eben eine Metasprache zur Beschreibung von Sprachen ...)

        Du kannst sagen: es gibt Grafiken in HTML. Das ist aber nur ideell.
        Erst wenn du ein korrekt notiertes <img>-Tag in einer HTML-Datei hast, wird daraus eine
        tatsaechliche Grafikreferenz. Und in dem Moment wird eben eine Realisierung, sprich eine
        Instanz des zugehoerigen JavaScript-Objekts erzeugt.
        Wieso erstmal eine Referenz und dann erst eine Instanz des Objekts?

        Hm. Auf die Gefahr hin, von Calocybes Erklärung abzuweichen, reite ich mal auf dem Problemkreis "Metaebenen" herum.

        So, wie ich die Sache sehe, hast Du hier zwei verschiedene Modelle für denselben Sachverhalt:
        a) Das Modell von HTML, für welches der HTML-Text integraler Bestandteil, das Bild jedoch nur eine Referenz (auf eine separat zu ladende Datei) ist.
        b) Das Modell von JavaScript, für welches das Bild eine (geladene) Instanz innerhalb seines Objektbaums ist.

        Kann man sagen, daß es sich bei

        Bild = new Image();
        Bild.src = "datei.gif";
        um die Instanz eines Objekts handelt, auf die noch nicht Bezug genommen wurde?

        Niemand zwingt Dich, zwei verschiedene Modelle gleichzeitig zu verwenden. "Instanz" und "Referenz" stammen aber aus verschiedenen Modellen.

        ist das einzige, was das Browser-Universum bereits kennt, die Idee einer Funktion (Objekt), von der ich nunmehr
        ein reales Exemplar (i.e. Instanz) namens "friends" gekreiert habe. Aber was habe ich erzeugt, wenn ich irgendwo weiter unten schreibe
        guterFreund =  new friends("Nepomuk", "Schnibbeldick", "103");
        Eine Instanz der Idee function oder eine Instanz der Instanz friends? Oder beides?

        Hm, ich würde sagen: "beides, aber aus zwei verschiedenen Blickwinkeln". Ein Irgendwas kann ggf. sehr wohl gleichzeitig eine Instanz einer übergeordneten Idee und eine Idee für untergeordnete Instanzen sein.
        Meta-Ebenen sind beliebig schachtelbar, und den Überblick zu behalten, auf welcher Ebene man sich gerade befindet, ist nicht immer einfach. Wenn man diesen verliert, versucht man oft, Widersprüche zwischen Konzepten verschiedener Ebenen aufzulösen, die in Wirkichkeit gar keine sind, weil an dieser Stelle niemand Konsistenz fordert - das verstellt dann den Blick auf das eigentliche Problem. (Puh - das war *etwas* abstrakt ...)

        <g> Nein. Ich versuche mich jetzt mal an Rolands Antwort. Wenn ich da zwei Stunden draufgeguckt habe, bin ich wahrscheinlich komplett plemplem.

        Programmieren ist eine Kombination aus Kunst und Handwerk. Der handwerkliche Teil besteht u. a. darin, die passenden Stellen in SelfHTML zu kennen; der künstlerische Teil besteht u. a. darin, das Selbstvertrauen aufzubringen, daß man eine Aufgabe lösen kann ...

        Im übrigen wäre ich auch für eine Aufnahme in die Forumsauslese, aber vielleicht so, daß auch sone wie ich das mal raffen. Vielen Dank jedenfalls erstmal,

        Vielen Dank auch für Deine Frage! Über so etwas nachzudenken ist wesentlich spannender als den 42. Verweis auf eine SelfHTML-Seite zu setzen!

        Und noch was, irgendjemand möge dem Valligator ein paar Zähnchen ziehen. Ohne Umbruch bringt wenig Punkte. Haust Du ihm von mir aufs Haupt? Ganz fest?

        Und von mir gleich noch eine mit ... ;-)

  3. Hi Uschi!

    Ich glaube, Deine Fragen sind ganz gut in http://developer.netscape.com/docs/manuals/js/client/jsguide/obj2.htm#1008342 beantwortet, wenn auch vielleicht nicht wirklich gut erklaert.

    Netscape ist der Meinung, zwischen klassenbasierter OOP (Objektorientierte Programmierung) und Protoypen-basierter OOP unterscheiden zu muessen, oder besser gesagt, letzteres erfinden(?) zu muessen.

    Klassenbasiert ist das, was Bio und Stefan Dir schon ansatzweise erlaeutert haben und wonach Du ja auch gefragt hast. Es wird dort zwischen der reinen Beschreibung, wie ein Ding "aussieht" und funktioniert (der Klassendefinition) einerseits und der konkreten Existenz eines Objektes (der Instanz) dieses so definierten Typs auf der anderen Seite unterschieden. So kann ich z.B. sagen, eine Strecke (im mathematischen Sinn; also eine Linie von einem Punkt zum anderen mit endlicher Laenge) hat einen Anfangspunkt und einen Endpunkt sowie eine Laenge. Das sind die *Eigenschaften*, aus denen sich eine Strecke definiert. So habe ich die Klasse beschrieben. Instanzen dieser Klasse waeren unter anderem eine Strecke, die von Punkt (1/2/3) bis (1/2/7) verlaeuft und somit eine Laenge von 4 (Laengeneinheiten) hat, eine andere Instanz waere (4/2/8)-(-3/2/8) mit der Laenge 7. (Ja, ich hab die Zahlen so gewaehlt, dass ich Pythagoras nicht anstrengen muss. *g*)

    Ausserdem kann ich einer Klasse *Methoden* hinzufuegen, was klasseneigene Funktionen sind, die letzlich die *Eigenschaften* einer Instanz in definierter Weise manipulieren. So koennte eine Methode Move() die Strecke um einen Vektor verschieben. Hierzu muss ich beschreiben, wie genau so ein Verschieben vor sich geht. Bekanntlich muss man einfach den Vektor auf jeden der Punkte der Gerade addieren. Wenn ich genau das in Code presse, habe ich die Klassendefinition um eine Methode erweitert.

    JavaScript verfolgt dieses klassenorientierte Modell jedoch nicht; stattdessen wird das prototypen-orientierte verwendet (dazu gleich). Nach meiner Meinung ist jedoch zu bezweifeln, ob dies ueberhaupt noch als "objektorientiert" ernstzunehmen ist. Im Sinne einer sauberen Programmierung sollte man auf die Moeglichkeiten, die aus dem Javascript-Konzept entstehen, besser verzichten (imho natuerlich) und versuchen, sich auf das klassische klassenorientierte zu beschraenken, soweit das von JS ueberhaupt unterstuetzt wird.

    Hier erstmal die direkte Uebersetzung des obigen Beispiels nach JS:

    // Der sog. Konstruktor eines Objektes
    // initialisiert die *Member* (Eigenschaften) einer
    // Instanz und bringt sie in einen definierten Zustand
    function Strecke(x1, y1, z1, x2, y2, z2) {
        // Eigenschaften mit uebergebenen Werten initialisieren
        this.x1 = x1; this.y1 = y1; this.z1 = z1;
        this.x2 = x2; this.y2 = y2; this.z2 = z2;
        this.len = 0;

    // Methoden bekannt machen
        this.CalcLength = Strecke_CalcLength;   // ohne Klammern!
        this.Move = MoveYourAss;                // Namen koennen natuerlich frei gewaehlt werden
        this.GetLength = new Function("return this.GetLength");
        // http://developer.netscape.com/docs/manuals/js/client/jsref/function.htm

    // Laenge durch Methode CalcLength() initialisieren lassen
        this.CalcLength();                      // mit Klammern -> Methode aufrufen
    }

    function Strecke_CalcLength() {
        var a, b, c;

    a = this.x2 - this.x1;
        b = this.y2 - this.y1;
        c = this.z2 - this.z1;

    this.len = Math.sqrt(a*a + b*b + c*c);
        return this.len;
    }

    function MoveYourAss(dx, dy, dz) {
        with (this) {
            x1 += dx; x2 += dx;
            y1 += dy; y2 += dy;
            z1 += dz; z2 += dz;
        }
    }

    Soweit die Klassendefinition. Ich kann jetzt mit

    a = new Strecke(1, 2, 3, 1, 2, 7);
        b = new Strecke(4, 2, 8, -3, 2, 8);

    die oben genannten Instanzen erzeugen. Ich kann jetzt die Laenge abfragen:

    lena = a.GetLength();
        lenb = b.GetLength();

    Dadurch wird die Funktion, die hinter GetLength steht (in diesem Fall ein on the fly erzeugtes Function-Objekt) aufgerufen, wobei die spezielle Variable this auf genau die Instanz zeigt, fuer welches die Methode invoked wird.

    Soweit habe ich mich an das Klassenkonzept gehalten. Die Sache mit den Prototypen bedeutet nun, dass die mit dem new-Operator erzeugte Instanz keineswegs ewig das in der Klasse fest definierte Aussehen beibehalten muss, sondern das so erzeugt Objekt lediglich als Prototyp angesehen wird, es aber nachtraeglich im Aussehen geaendert werden kann. Soll heissen, ich kann mit

    a.masse = "3 kg";

    der Strecke a einfach eine weitere Eigenschaft hinzufuegen (die offensichtlich nicht viel mit einer Strecke zu tun hat). Die Strecke b hat diese Eigenschaft dann aber trotzdem nicht. Somit haben die verschiedenen "Instanzen" (naja, nicht wirklich Instanzen) eigentlich nicht mehr viel miteinander zu tun. Genau so kann ich bei window.history eine x-beliebige Eigenschaft hinzufuegen, aber Sinn macht das sicher kaum.
    Und genau das geht in einer "richtigen" OO-Sprache nicht (wobei Java und C++ eigentlich auch noch manches aus der OO-Theorie vermissen lassen).

    Wir hatten jetzt also die Begriffe Klasse und Instanz, deren Bedeutung in JS jedoch verblasst. Der Begriff Objekt wird meistens als Synonym fuer Instanz benutzt.

    Es gibt ein Objekt namens images, das ist vorgefertigt. Wenn ich nun ein Bildchen in meine Datei einbinde,

    »»

    <img src="bildchen.gif" height="10" width="10" name="blubber">

    »»

    ist das dann ein Objekt oder die Instanz eines Objekts images, und worin liegt der Unterschied, und was wäre dann eine Klasse?

    Wenn der Browser die Datei laedt, wird fuer jedes <img> eine Instanz der Klasse Image erzeugt und in das images-Array eingehaengt. Das sind Wrapper-Objekte, wodurch der Zugriff auf das Dokument ermoeglicht werden soll.

    Da Objekte und Arrays in JS aber dasselbe sind, ist document.images selbst nicht nur ein Array, das lauter Image-Instanzen enthaelt, sondern es ist (leider) auch richtig, wenn man es als auch als Objekt bezeichnet, welches die einzelnen Bilder als Eigenschaften hat. Dann ist es aber ein sehr armseliges Objekt, denn es ist tatsaechlich nichts anderes als eine blosse Auflistung und bietet keinerlei Mehrwert. (Die Strecke hatte z.B. die Methode Move(), die einem die Arbeit abnimmt, selbst die Addition des Vektors durchzufuehren, und somit etwas mehr kann, als ein blosses Array, welches die sechs Werte fuer die zwei Eckpunkte speichert.)

    Ich habe aus Selfhtml gelernt, daß die images eines Dokuments vom Browser als Array behandelt werden.
    Also Array == normale Variablen oder Objekte, je nachdem, was drin ist?

    Arrays und Objekte sind in JS dasselbe. Es handelt sich einfach um zwei verschiedene Schreibweisen fuer den Zugriff auf ein und dieselbe Datenstruktur.

    document.images.bildname
    document.images["bildname"]
    document["images"].bildname
    document["images"]["bildname"]

    Alles dasselbe. Zu beachten ist vielleicht noch, dass Arrays in JS sogenannte assoziative Arrays sind, d.h. als Index koennen nicht nur Zahlen verwendet werden, sondern auch Strings.

    Noch was: Ein Objekt ist eigentlich eine Referenz auf ein Objekt. Dass heisst, mit

    a = new Strecke(1, 2, 3, 1, 2, 7);

    bekomme ich nach a kein Objekt an sich, sondern einen Zeiger, der auf eine Struktur irgendwo in den Speichertiefen des Browsers verweist. Das entscheidende dabei ist, dass ich mit

    a = c;

    keineswegs ein ganzes Objekt kopiere und hinterher zwei habe, sondern nur die Referenz kopiert wird und dann beide Variablen auf *ein und dasselbe* Objekt zeigen. Rufe ich also

    a.Move(2, 5, 3);

    auf, sehe ich die Aenderung auch mit alert(c.x1). Siehe auch <../../sfarchiv/2000_1/t10312.htm#a51977>, evtl auch <../../sfarchiv/2000_1/t10566.htm#a53329>.

    (Eine Methode ist nur eine Referenz auf ein Function-Objekt, weshalb a.Move auch saemtliche in http://developer.netscape.com/docs/manuals/js/client/jsref/function.htm gelisteten Eigenschaften hat, incl. toSource. Just try alert(a.Move.toSource()).)

    Ganz einfach, das alles, ne? Aber frag ruhig weiter, wenn noetig. ;-)
    Naja, eigentlich wollte ich Dich ja nur auf den erstgenannten Link verweisen, weil da steht ja alles drin und noch viel mehr, aber dann bin ich wohl ins Schwafel gekommen. *g*

    So long, Roland

    1. Naja, eigentlich wollte ich Dich ja nur auf den erstgenannten Link verweisen, weil da steht ja alles drin und noch viel mehr, aber dann bin ich wohl ins Schwafel gekommen. *g*

      Aufnehmen in die Forum-Auslese?

    2. Hi Roland,

      Ganz einfach, das alles, ne? Aber frag ruhig weiter, wenn noetig. ;-)

      <g>Nö, Rückfragen sind bestimmt nicht nötig. Das liest sich wie die Bildzeitung ;-). Aber ich druck mir das jetzt aus und geh damit in die Lehmkuhle.

      Naja, eigentlich wollte ich Dich ja nur auf den erstgenannten Link verweisen, weil da steht ja alles drin und noch viel mehr, aber dann bin ich wohl ins Schwafel gekommen. *g*

      jaja, die schwatzhaftigkeit

      mit schon im voraus geplanten kopfschmerzen verbleibe ich mit lieben grüßen, Uschi

      1. Hi Uschi,

        jaja, die schwatzhaftigkeit

        mit schon im voraus geplanten kopfschmerzen verbleibe ich mit lieben grüßen, Uschi

        dann machen wir es einfacher ;-) Objekt und Instanz sind im Prinzip nur andere Namen für Variablen. Objekt ist ein anderer Name für Typ, z.B. int. Instanz ist dann eine Variable von diesem Typ. Solange keine Vererbung dazu kommt passt das ;-)

        Gruß,
        Martin

        1. Hi Martin,

          dann machen wir es einfacher ;-) Objekt und Instanz sind im Prinzip nur andere Namen für Variablen. Objekt ist ein anderer Name für Typ, z.B. int. Instanz ist dann eine Variable von diesem Typ. Solange keine Vererbung dazu kommt passt das ;-)

          ist das jetzt nicht ein bischen zu einfach?  Jede Didaktik arbeitet vernünftigerweise mit Stoffreduktion. Aber die Grenze der Reduktion muß da liegen, wo Aussagen nicht mehr richtig sind. Ich hatte bis jetzt so verstanden, daß ich einer Variablen zu einem Zeitpunkt genau einen Wert speicher kann (Eigenschaft der Variablen???). Nur können im Unterschied zu solchen einfachen Variablen in bzw. zu Objekten wesentlich mehr Dinge abgespeichert werden, nämlich mehrere Eigenschafte und gar Methoden. Jedenfalls hatte ich das bis jetzt so verstanden. OnError bitte Antwort.
            
          Liebe Grüße, Uschi

          1. Ich hatte bis jetzt so verstanden, daß ich einer Variablen zu einem Zeitpunkt genau einen Wert speicher kann (Eigenschaft der Variablen???).
            Nur können im Unterschied zu solchen einfachen Variablen in bzw. zu Objekten wesentlich mehr Dinge abgespeichert werden, nämlich mehrere Eigenschafte und gar Methoden. Jedenfalls hatte ich das bis jetzt so verstanden. OnError bitte Antwort.

            Wenn es nur die "mehrere Eigenschaften" wären, dann wäre ein Array keine Variable, oder eine "struct" in C bzw. ein "record" in Pascal. Sind sie aber.
            Eine Variable kann sehr wohl eine Struktur aufweisen und dann eben auch mehrere Eigenschaften haben; wie komfortabel diese Struktur ist (bei einem Array sprichst Du die Komponenten über eine Nummer an, bei einem struct über einen Feldnamen), ist nicht ausschlaggebend.

            Eine Klasse hat in der Tat einiges mit einer Typbeschreibung zu tun. Hierzu solltest Du Dir Programmiersprachen ansehen, bei denen man mit Typbeschreibungen wirklich etwas tun kann, vor allem Pascal ist da sehr zu empfehlen. Perl oder JavaScript erlauben hier leider kaum etwas; Perl kompensiert oftmals mit Objekten etwas, das Pascal auch schon mit record-Typen lösen kann.

            Was m. E. eine Klasse von einer Typbeschreibung unterscheidet, das ist:

            • bei einem Objekt hat der Anwender bewußtere Kontrolle über die Lebensdauer der Variablen (new() bzw. entsprechenden Terminationsfunktionen) als bei Variablen, deren Existenzbeginn und -ende meistens als Seiteneffekte von anderen Ereignissen (Funktionsaufruf -> impliziter Gültigkeitsbereich) beeinflußt wird.
            • ein Objekt kann neben passiven auch aktive Daten (Funktionen) enthalten. Wenn man in Maschinensprache denkt, ist das nichts Ungewöhnliches (schließlich steht alles im selben Hauptspeicher herum), aber vieloe höhere Prgoammiersprachen trennen (wiederum aus didaktischen Gründen: Selbstmodifizierender Code ist bezüglich Debugging eine Katastrophe) zwischen Code und Daten. (Deshalb ist z. B. "eval" so schwer zu verstehen, weil es gegen diese Trennung verstößt.)
          2. Hi Uschi,

            ist das jetzt nicht ein bischen zu einfach?

            die Antwort von Michael kann ich voll unterstützen ;-) Der Gag an Objekten ist hauptsächlich die Kapselung von Daten. Grundgedanke ist der, dass man einen Satz an Funktionen (hier Methoden) hat, mit denen man die Daten bearbeiten kann. Natürlich geht das auch mit normalen Funktionen und Variablen, aber sobald man eine Variable mehrmals verwenden will wird es übersichtlich.

            Kleines Beispiel: ein Fenster unter Windows. Jedes Fenster hat eine bestimmte Breite und Höhe. Wenn man jetzt mehrere Fenster öffnen will, muss man die Daten in einem Array oder einer Liste ablegen. Und die Funktionen ändern damit sie wissen zu welchem Fenster welche Daten gehören. Damit wird alles unübersichtlicher und schlechter wartbar.

            Gruß,
            Martin

          3. Hallo Uschi,

            jetzt versuche ich mich auch noch an einer Antwort, weil mir der Beitrag von Michael doch etwas zu technisch ist.

            Stelle dir ein Auto vor:
            Ein Auto hat verschiedene Eigenschaften: eine Lackfarbe, einen Hersteller, eine Fahrgestellnummer, Besitzer usw.
            Ein Auto kennt auch verschiedene Methoden: fahren, reparieren, kaufen, umlackieren usw.

            Damit ist zunächst einmal das Auto an sich beschrieben, ohne ein spezielles Auto zu beschreiben.
            Das Auto ist also eine Klasse mit definierten Eigenschaften (Zuständen) und Methoden (ausführbaren Aktionen, die eine Veränderung von Eigenschaften bewirken können oder eine weitere Aktion anstoßen können).
            Oder anders gesagt: Eine Klasse definiert die Eigenschaften und Methoden eines Objektes.

            Wird ein bestimmtes Auto hergestellt, dann wird sozusagen eine Instanz des Objektes Auto erzeugt mit den in der Klasse Auto beschriebenen Eigenschaften und Methoden.
            In dieser Instanz des Objektes Auto werden den Eigenschaften nun Werte zugewiesen. Lackfarbe = Blau, Hersteller = Ferrari (hat jemand schon einmal einen blauen Ferrari gesehen?), Fahrgestellnummer = XYZABC000, Besitzer=Autohaus Schmidt
            Die Methoden des Objektes Auto können nun an der konkreten Instanz ausgeführt werden. Also: Der blaue Ferrari kann gekauft werden. Die Ausführung dieser Methode bewirkt eine Veränderung der Eigenschaft Besitzer. Meier kauft einen blauen Ferrari von Autohaus Schmidt. Dann ändert dadurch die Eigenschaft Besitzer den Wert.

            Die Instanz selbst, also der blaue Ferrari, besteht nicht mehr aus abstrakten Beschreibungen, sondern hat Substanz. EDV-technisch drückt sich diese Substanz durch die Belegung einer Speicheradresse, also der Existenz einer Variablen aus.
            Daher auch die krasse Reduktion von Martin. Die ganze Instanz ist einer Variablen zugewiesen. Die Instanz selbst ist sozusagen die Verkörperung, die Zusammenfassung oder auch Adresse der Instanz. Du sprichst eine Eigenschaft von etwas an, oder führst eine Methode mit etwas aus. Womit, das ist in der einzelnen Variable, der Instanz definiert.

            Die Eigenschaft blau der Instanz 'blauer Ferrari' belegt natürlich wiederum eine Variable. Aber diese Variable existiert nicht unabhängig für sich alleine, sondern immer nur in Zusammenhang mit der Instanz 'blauer Ferrari'. Existiert der blaue Ferrari nicht mehr, dann hat auch die Eigenschaft blau keine Bedeutung mehr.

            Ufff. Ich hoffe, dies Beispiel ist hilfreich.
            Viele Gruesse
              Kess

            1. Hallo Kessi,

              »

              Ufff. Ich hoffe, dies Beispiel ist hilfreich.

              <freu>, sogar sehr. Übrigens habe ich noch keinen blauen Ferrari gesehen. Vielen Dank.

              Liebe Grüße, Uschi

              1. Sorry Kess, natürlich ohne i

  4. Hallo Uschi

    Wär lieb, wenn ihr mich aufklären könntet :)

    Sandkastenspiele: Denk einfach an die schöne Zeit zurück als du noch im Sandkasten gespielt hast und dich noch nicht mit objekt-orientierter Programmierung rumgeschlagen hast.

    Ein Sandkuche: (das Objekt)
    Das Förmchen: (deine Klasse)
    Das Häufchen Sand, dass aus dem
    umgestürzten Förmchen kommt: (die Instanz)

    Also Array == normale Variablen oder Objekte, je nachdem, was drin ist?

    Du hast recht. Hier mischen sich die klassische stukturierte Programmierung und die objektorientierte Programmierung.

    Ein klassische Programm hat eine lange Liste Variablen und getrennt davon eine lange Liste von Funktionen. In einem objektorientierten Programm werden die selben Variablen und Funktionen nicht getrennt gesehen sondern thematisch zu Gruppen zusammengefasst.

    Also alle Variablen die etwas mit dem logischen Konstrukt Bild zu tun haben (Bildinhalt, Breite, Höhe...) werden zusammengefasst und Objekt genannt (die "Eigenschaften" des Bildes). Die Funktionen die etwas mit dem Bild zu tun haben werden jetzt Methoden genannt und kommen dazu. (die "Fähigkeiten" des Bildes) und fertig ist die Klasse.

    Das ganze ist also nichts wirklich Neues sondern nur zwei verschiedene Sichtweise auf ein und das Selbe.

    Stephan Schmid