heinetz: Javascript Klasse erweitern usw.

Hallo Forum,

ich möchte eine bestehende JS-Klasse etwas erweitern.

Im Moment sieht das ganze so aus:

  
var myobject = new myclass('element', {  
 a : 'a_val',  
 b : 'a_val'  
});  

Ich kann danach z.B. die Methode 'myobject.func_one()' ausführen oder auf die Eigenschaft 'myobject.prop_one' zugreifen.

Nun habe ich schon herausgefunden, wie ich es schaffe, die Klasse 'myclass' um eine zusätzliche Methode 'func_two' zu erweitern, damit die mir für meine Instanz 'myobject' zur Verfügung steht, ich sie also per 'myobject.func_two()' ausführen kann.

  
myclass.prototype.func_two = function(){  
 //Code  
};  

Aber das reicht mir nicht ;) Ich hätte lieber eine weitere Klasse 'myotherclass', die sämtliche Eigenschaften und Methoden der Klasse 'myclass' und zusätzlich eine Methode 'func_two' enthält, so dass:

  
var myobject = new myclass('element', {  
 a : 'a_val',  
 b : 'a_val'  
});  

... nach wie vor dazu führt, dass ich 'myobject.func_one()' ausführen oder auf die Eigenschaft 'myobject.prop_one' zugreifen kann und:

  
var myotherobject = new myotherclass('element', {  
 a : 'a_val',  
 b : 'a_val'  
});  

... mir ermöglicht 'myotherobject.func_one()' UND 'myotherobject.func_two()' ausführen kann.

Das ist wohl das Prinzip der Vererbung, oder?

Ich habe folgenden Ansatz versucht:

  
myotherclass = function(){  
}  
  
myotherclass.prototype = new myclass();  
myotherclass.prototype.constructor = myotherclass;  
myotherclass.prototype.func_two = function(){  
//Code  
}  

... aber das war's irgendwie nicht. Irgendwie kam es mir auch komisch vor,
denn hier wird ja eine Instanz von myclass angelegt und die erwartet Parameter.

beste gruesse,
heinetz

  1. Javascript ist klassenlos, Objektorientiertheit wird stattdessen über Prototyping realisiert. Prototyping ist eine abstraktere Umsetzung dieses' Paradigmas. Wenn dir der klassenorientierte Ansatz vertraut ist, Prototyping für dich aber Neuland ist, empfehle ich dir den Artikel von molily zu dem Thema.

  2. Lieber heinetz,

    myclass.prototype.func_two = function(){

    //Code
    };

      
    wozu das Prototyping? Damit gibst Du allen Instanzen dieses Objekttyps diese Methode. Anscheinend willst Du das ja garnicht. Also gib Deinem aktuellen Objekt diese Methode \*direkt\* mit (im Gegensatz zu PHP kann man das in JS machen):  
      
    ~~~javascript
    var myobject = new myclass('element', {  
     a : 'a_val',  
     b : 'a_val'  
    });  
      
    myobject.func_two = function (a1, b2) {  
        alert("Func2!\nA1: "+a1+"\nB2: "+b2):  
    };
    

    Liebe Grüße,

    Felix Riesterer.

    --
    ie:% br:> fl:| va:) ls:[ fo:) rl:| n4:? de:> ss:| ch:? js:) mo:} zu:)
    1. Tach!

      Also gib Deinem aktuellen Objekt diese Methode *direkt* mit (im Gegensatz zu PHP kann man das in JS machen):

      Das kann man mit PHPs runkit auch machen - wenn man es denn unbedingt will. Aber was bei Javascript mangels Klassen quasi Notwendigkeit ist, muss man in PHP nicht zwangsläufig anwenden wollen. Da gibt es wenigstens das Konzept erweiterbarer Klassen. Der Vergleich mit PHP ist hier etwas unsinnig. Und viele andere Sprachen können auch nicht direkt Objekte erweitern, aber einige könnten das zumindest über Umwege - nur macht man das üblicherweise und aus gutem Grund nicht, wenn es auch anders geht.

      dedlfix.

      1. "bei Javascript mangels Klassen" und "Da [PHP] gibt es wenigstens das Konzept erweiterbarer Klassen" klingt ein wenig gemein. Immerhin kannst du beides mit Prototyping ganz einfach nachbasteln, der umgekehrte Weg dürfe schwieriger sein. Aber klassenlos rockt, also wofür?

        1. Tach!

          "bei Javascript mangels Klassen" und "Da [PHP] gibt es wenigstens das Konzept erweiterbarer Klassen" klingt ein wenig gemein. Immerhin kannst du beides mit Prototyping ganz einfach nachbasteln, der umgekehrte Weg dürfe schwieriger sein. Aber klassenlos rockt, also wofür?

          Ich wollte eigentlich keine Wertung vornehmen, welches System nun besser ist. Das ist auch ein Äpfel- und Birnen-Vergleich. Jedes System ist (im besten Fall) im Hinblick auf die zukünftige Verwendung geplant. Für "das bisschen Browser-Scripting" braucht es sicher keine ausgewachsene OOP-Funktionalität, weswegen das mit dem Prototyping ausreichend sein wird. Dass man das allerdings weniger in All-Purpose-Sprachen findet, also solchen, die nicht nur auf den Browser beschränkt konzipiert wurden, spricht für mich eher dafür, dass es für die allgemeine Verwendung nicht unbedingt als geeignet angesehen wird. (Das ist jetzt aber auch nur mein Halbwissen zu diesem konzeptionellen Aspekt. Ich bin da nur Anwender, der mit dem Vorlieb nehmen muss, was vorhanden ist. Darüber zu philosophieren, was besser oder schlechter ist, bringt mich in meiner täglichen Arbeit nicht weiter.)

          dedlfix.

          1. Ich wollte eigentlich keine Wertung vornehmen, welches System nun besser ist. Das ist auch ein Äpfel- und Birnen-Vergleich.

            Da stimme ich dir zu.

            Für "das bisschen Browser-Scripting" braucht es sicher keine ausgewachsene OOP-Funktionalität, weswegen das mit dem Prototyping ausreichend sein wird.

            Du kannst ja auch klassenorientiert entwickeln wenn du möchtest, Implementationen und Frameworks gibt es wie Sand am Meer. Meine Erfahrung ist jedoch, dass viele Javascript-Entwickler das garnicht wollen, man hat immerhin eine mächtigere Umsetzung der Objektorientiertheit.

            Und "das bisschen Browser-Scripting" gibt es zwar, aber es gibt eben auch komplexe WebApps, die zunehmend an Popularität gewinnen.