Christian S.: Vererbung in JavaScript

Hallo,

ich habe eine Basisklasse in JavaScript:

function Base()
{
}

Base.prototype.Myfunction = function()
{
// tu was
}

[...]

dann habe ich ein Objekt, das all die Methoden und Properties der Basisklasse haben soll (+ weitere eigene):

var myObject = {};
myObject.WeitereProperty = true;

Später möchte ich einfach myObject.Myfunction() aufrufen können.

kann ich das so irgendwie machen:

myObject.prototype = Base;

??

Gruß
Christian

  1. gruss Christian S.

    ich habe eine Basisklasse in JavaScript:

    function Base() {
         /*
           so weit so gut -
           das hier ist Dein: [[Base]]-konstruktor.

    umgangssprachlich kannst Du das ding auch ruhig als
           Klasse bezeichnen, obwohl immer mal wieder darauf
           hingewiesen sein soll, dass JavaScript klassenlos ist -

    es gibt nur objekte. diese koennen von konstruktoren
           erzeugt werden, muessen es aber nicht.
           vererbung erfolgt zum einen ueber das [prototype]-objekt,
           sofern dieses vorhanden ist (bei reinen objekten - z.b.:
           var obj = {}; - muss diese eigenschaft ausdruecklich
           gesetzt werden).
           maechtiger noch ist in JavaScript das konzept der
           schnittstellenvererbung. das [[Function]] objekt
           des Sprachkerns stellt die beiden methoden [apply]
           und [call] fuer diese art (kontextabhaengiger)
           delegation zur verfuegung.
         */

    }

    
    > ...  
    > ~~~javascript
    
    Base.prototype.myFunction = function () {  
         /*  
           stil:  
           es gibt zwar keine zwingende schreibstil-konvention,  
           trotzdem sollte man grosse anfangsbuchstaben nur fuer  
           konstruktoren verwenden.  
         */  
    
    > };
    
    

    ...

    var myObject = {};

    myObject.WeitereProperty = true;

    // myObject.weitereProperty = true; // siehe oben.

    
    > ...  
    > Später möchte ich einfach myObject.Myfunction() aufrufen können.  
    >   
    > kann ich das so irgendwie machen:  
    >   
    > myObject.prototype = Base;  
      
       du warst nah dran, fuer Deine zwecke muss der [prototype] aber  
       kein konstruktor sein, sondern ein durch diesen konstruktor  
       erzeugtes objekt:  
      
       ~~~javaScript
    myObject.prototype = new Base(); // manche schreiben auch ...  
       myObject.prototype = new Base; //, was auch nicht falsch ist.
    

    by(t)e by(t)e - peterS. - pseliger@gmx.net

    --
    »Because objects in JavaScript are so flexible, you will want to think differently about class hierarchies.
    Deep hierarchies are inappropriate. Shallow hierarchies are efficient and expressive.« - Douglas Crockford
    ie:( fl:) br:> va:( ls:& fo:) rl:| n3;} n4:} ss:} de:µ js:} mo:? zu:]
    1. Hi,

      myObject.prototype = Base;

      du warst nah dran, fuer Deine zwecke muss der [prototype] aber
         kein konstruktor sein, sondern ein durch diesen konstruktor
         erzeugtes objekt:

      myObject.prototype = new Base();

      also es ging eher so:

      var myObject = new Base();

      weitere Members kann ich dann mit:

      myObject.myprop = 3;

      zuweisen.

      Ist diese Vererbung auch möglich, wenn ich myObject durch ein Literal deklariere??

      also so:

      var myObject = {myprop:3};

      und dass dann trotzdem noch geerbt wird von Base ??

      es nervt noch ein bisschen jedes mal myObject zu schreiben...

      Gruß
      Christian

      1. hallo again Christian,

        Ist diese Vererbung auch möglich, wenn ich myObject durch
        ein Literal deklariere?? ... also so:

        var myObject = {myprop:3};

        und dass dann trotzdem noch geerbt wird von Base ??

        probier es doch einfach aus - ich hab' mich dazu doch
           schon in meiner ersten antwort geaeussert. in Deinem
           bsp. ist mir Deine ungewoehnliche vererbungsstrategie
           durchaus aufgefallen - JavaScript ist sehr flexibel; es
           sollte nichts dagegen sprechen, auch auf dem von Dir
           gewaehlten weg zum ziel zu gelangen:

        ~~~javascript var myObject = {myprop:3};
           myObject.prototype = new Base();

          
          
           neugierig - peterS. - pseliger@gmx.net  
          
          
        
        -- 
        »Because objects in JavaScript are so flexible, you will want to think differently about class hierarchies.  
        Deep hierarchies are inappropriate. Shallow hierarchies are efficient and expressive.« - [Douglas Crockford](http://javascript.crockford.com/)  
          
        ie:( fl:) br:> va:( ls:& fo:) rl:| n3;} n4:} ss:} de:µ js:} mo:? zu:]
        
        1. hallo Interessierte,

          weitere erklaerungen und loesungsansaetze werden
             im moment unter geandertem thema ausnahmsweise
             in einem neuen thread gegeben bzw. weiterdiskutiert:

          Objekte (Literale) erben lassen

          um verstaendnis bittend - peterS.