Paul: dojo

Moin, ich bin Anfänger in OOP und dojo.

Wenn ich in eine vorhandene Methode einer Class (von meinem Vorgänger) eine Veränderung machen muss, kann ich eine einzige Zeile in den Quelltext meines Vorgängers einfügen und es läuft so wie es sein soll.

Nun ist aber das Problem, dass ich die alten Sachen meines Vorgängers nicht verändern soll, sondern "nur" benutzen soll.

Wie kann ich die eine Zeile (in einer Methode einer Klasse) "von außen" ändern bzw. ergänzen?

Gruß, Paul

  1. Hallo,

    Wie kann ich die eine Zeile (in einer Methode einer Klasse) "von außen" ändern bzw. ergänzen?

    das könntest du mit Vererbung realisieren.

    Gruß
    Kalk

    1. hm, da kommt bei google was mit declare raus. passt das?

      1. Hallo,

        hm, da kommt bei google was mit declare raus. passt das?

        würde mich wundern, das Schlüsselwort bei Vererbung sollte extends sein. Habe aber keine Ahnung wie bei JS die Vererbung funktioniert.

        Gruß
        Kalk

        1. Moin!

          Hallo,

          hm, da kommt bei google was mit declare raus. passt das?

          würde mich wundern, das Schlüsselwort bei Vererbung sollte extends sein. Habe aber keine Ahnung wie bei JS die Vererbung funktioniert.

          Und dabei hat Molily das so schön erklärt…

          // Das ist eine "Klasse"
          function Katze () {
            var schnurr="rrrrrrrrrrrrrrrrrrrrrrrrr";
            this.schnurren = function () {
              alert (schnurr);
            }
          };
          
          var mauzi = new Katze(); // Objekt von Klasse ableiten
          
          // Klasse mit Protyping erweitern
          Katze.prototype.miau = function () {
              alert("Miau!");
          };
          
          var sylvester = new Katze(); // Objekt von erweiterter Klasse ableiten
          // … und so benutzt:
          
          
          mauzi.schnurren();
          sylvester.schnurren();
          mauzi.miau();
          

          (von mir erweitert)

          Jörg Reinholz

          1. Hallo,

            [Und dabei hat Molily das so schön erklärt…]

            mit anderen Worten das gesuchte Schlüsselwort ist weder "declare" noch "extends", sondern "prototype".

            Gruß
            Kalk

            1. Moin!

              mit anderen Worten das gesuchte Schlüsselwort ist weder "declare" noch "extends", sondern "prototype".

              Jein, denn so ganz falsch hast Du nicht gelegen.

              Jörg Reinholz

              1. Moin!

                
                <html>
                <script>
                // Das ist eine "Klasse"
                function Katze () {
                  var schnurr="rrrrrrrrrrrrrrrrrrrrrrrrr";
                  this.schnurren = function (s="Katze") {
                    alert(s + ": " + schnurr);
                  }
                };
                
                var mauzi = new Katze(); // Objekt von Klasse ableiten
                
                // Klasse mit Protyping erweitern
                Katze.prototype.miau = function (s="Katze") {
                    alert(s + ": " + "Miau!");
                };
                
                Katze.prototype.miau = function (s="Katze") {
                    alert(s + ": " + "Mijau Mijau");
                };
                
                var sylvester = new Katze(); // Objekt von erweiterter Klasse ableiten
                // … und so benutzt:
                
                mauzi.schnurren('Mauzi');
                sylvester.schnurren('Sylvester');
                mauzi.miau('Mauzi');
                sylvester.miau('Sylvester');
                
                </script>
                <body>
                <h1>Katze</h1>
                </body>
                </html>
                

                Unschön: Es werden auch bereits abgeleitete Objekte geändert und dabei Eigenschaften und Methoden überschrieben.

                Jörg Reinholz

                1. Hallo Jörg Reinholz,

                  
                  Katze.prototype.miau = function (s="Katze") {
                      alert(s + ": " + "Mijau Mijau");
                  };
                  

                  Im Struwwelpeter drohen die Katzen Mienz und Maunz „Miau Mioh Miau Mioh“

                  Im Französischen heißen die übrigens Minz und Tristepatte (= traurige Pfote)

                  Bis demnächst
                  Matthias

                  --
                  Das Geheimnis des Könnens liegt im Wollen. (Giuseppe Mazzini)
                  1. Hallo Matthias Apsel,

                    Im Struwwelpeter drohen die Katzen Mienz und Maunz „Miau Mioh Miau Mioh“

                    Mienz und Maunz

                    Urheber: „Bundesarchiv B 145 Bild-F001104-0003, Köln, WDR Fernsehstudio“ von Bundesarchiv, B 145 Bild-F001104-0003 / Brodde / CC-BY-SA 3.0. Lizenziert unter CC BY-SA 3.0 de über Wikimedia Commons - https://commons.wikimedia.org/wiki/File:Bundesarchiv_B_145_Bild-F001104-0003,_Köln,_WDR_Fernsehstudio.jpg#/media/File:Bundesarchiv_B_145_Bild-F001104-0003,_Köln,_WDR_Fernsehstudio.jpg

                    Bis demnächst
                    Matthias

                    --
                    Das Geheimnis des Könnens liegt im Wollen. (Giuseppe Mazzini)
                    1. Hallo,

                      „Bundesarchiv

                      hey, du bist grad auf Rekordkurs im Threaddrifting!

                      Gruß
                      Kalk

                2. Hallo Jörg

                  Unschön: Es werden auch bereits abgeleitete Objekte geändert und dabei Eigenschaften und Methoden überschrieben.

                  Das ist das Grundprinzip, nach dem Vererbung in JavaScript funktioniert. Sprich, vergleichbar mit der identifier resolution innerhalb der scope chain wird beim Zugriff auf eine Eigenschaft zunächst einmal geprüft, ob das jeweilige Objekt eine eigene Eigenschaft mit dem entsprechenden Bezeichner besitzt. Ist dies nicht der Fall, dann wird geprüft, ob der Prototyp des Objektes über eine solche Eigenschaft verfügt, und wenn dem so ist, diese Eigenschaft referenziert. War die Suche bei diesem Objekt jedoch ebenfalls ohne Erfolg, dann wird wiederum bei dessen Prototyp nachgesehen, und so weiter und so fort. Geerbte Eigenschaften sind hier also immer eigene Eigenschaften eines anderen Objektes.

                  Wird ein Instanzobjekt durch den Aufruf einer Funktion als Konstruktor erzeugt, dann bedeutet das, dass diese Funktion im Kontext des Objektes ausgeführt wird, die Funktionsvariable this also mit dem erstellten Objekt initialisiert wird. Die innerhalb des Konstruktors vorgenommenen Zuweisungen erzeugen mithin eigene Eigenschaften des auf diese Weise erstellten Objektes.

                  var Constructor = function ( ) {
                    'use strict';
                    this.foo = 1;
                    this.bar = 2;
                  };
                  
                  Constructor.prototype.baz = 3;
                  
                  var a = new Constructor( );
                  console.log(Object.getOwnPropertyNames( a )); // ['foo', 'bar']
                  
                  var b = new Constructor( );
                  console.log(Object.getOwnPropertyNames( b )); // ['foo', 'bar']
                  

                  Sowohl a als auch b verfügen hier nun über die eigenen Eigenschaften foo und bar, während baz eine eigene Eigenschaft des Objektes bleibt, welches der Wert von Constructor.prototype ist, denn da hier weder a noch b über eine eigene Eigenschaft mit dem Bezeichner baz verfügen, wird beim Zugriff auf die Eigenschaft in der Prototypenkette gesucht und dem zur Folge bei beiden Instanzobjekten Constructor.prototype.baz referenziert. Wird diese Eigenschaft nun verändert, dann betrifft diese Veränderung selbstverständlich auch beide Objekte, a und b.

                  Gruß,

                  Orlok

                  --
                  „Das Wesentliche einer Kerze ist nicht das Wachs, das seine Spuren hinterlässt, sondern das Licht.“ Antoine de Saint-Exupéry
              2. Hallo,

                Jein, denn so ganz falsch hast Du nicht gelegen.

                naja, aber ist das nicht einfach eine Erweiterung des Prototypes mit einer Funktion namens extends, die theoretisch auch "erweitere" heißen könnte? Also kein Schlüsselwort, sondern ein im Prinzip beliebiger Name.

                JS strickt halt das ganze OOP-Voodoo ein bisschen anders als andere.

                Gruß
                Kalk