Don P: Vererbungshierarchie ?!?

Beitrag lesen

Hallo Struppi,

Auch wenn jetzt die Frage noch nicht geklärt ist, was mir die Funktion object() bringt, hat mir das auf jeden Fall schon mal geholfen.

Zum Sinn der Funktion object() kann ich die noch folgendes Beispiel geben, das die direkte Vererbung demonstriert. Die (ebenfalls von Crockford übernommene) Funktion typeOf() dient hier lediglich dazu, JavaScript's unzureichende Auskunft typeof [] === 'object' zu umgehen, object() ist ja die bereits bekannte Funktion:

  
var typeOf = function (v){var s=typeof v;if(s!=='object'){return s;}if(!v){return'null';}if(typeof v.length==='number'&&!(v.propertyIsEnumerable('length'))&&typeof v.splice==='function'){return'array';}return s;};  
var object = function(o){function F(){}F.prototype=o;return new F();};  
  
var array = [5,6,7,8,9],  
    copy1 = object(array),  
    copy2 = object(copy1)  
;  
  
alert([ typeOf(array), typeOf(copy1), typeOf(copy2) ]); // array,array,array  
  
alert([ array[3], copy1[3], copy2[3] ]); // 8,8,8  
  
copy1[3] = 80;  
alert([ array[3], copy1[3], copy2[3] ]); // 8,80,80  
  
copy2[3] = 800;  
alert([ array[3], copy1[3],  copy2[3] ]); // 8,80,800  
  
delete copy2[3];  
alert([ array[3], copy1[3], copy2[3] ]); // 8,80,80  
  
delete copy1[3];  
alert([ array[3], copy1[3], copy2[3] ]); // 8,8,8

Jedes Array erbt direkt vom Vorgänger. Die prorotype-chain ist intakt, d.h. solange man einer Kopie keine Werte direkt zuweist, sind sie sozusagen transparent, man sieht dann einfach die entsprechenden Eigenschaften der Vorgänger.

Für die Vererbung an weitere Instanzen ist kein Kontruktor notwendig, abgesehen natürlich von dem in object().

Als praktische Anwendung kann man sich z.B. DOM-Elemente vorstellen, die in Schritten dynamisch verändert werden, wobei man anschließend durch Löschen von neueren Werten in den Kopien die vorherigen Zustände ganz einfach wieder herstellen kann.

Natürlich können die Objekte auch jeweils durch weitere Eigenschaften/Methoden erweitert werden bevor oder während sie sich vererben (z.B. mit Hilfe meiner genannten oobject()-Funktion oder "zu Fuß"), usw. usf. Der Fantasie sind hier keine Grenzen gesetzt...

Ich wüsste jetzt gar nicht auf Anhieb, wie man das alles mit Konstruktoren machen würde, so vertraut ist mir inzwischen das object()-Konzept :-).

Gruß, Don P

--
sh:( fo:) ch:? rl:( br:] n4:~ ie:% mo:? va:{ js:) de:/ zu:] fl:( ss:| ls:&
0 67

Vererbungshierarchie ?!?

Kurt Z
  • javascript
  1. 0
    Struppi
    1. 0
      molily
    2. 0
      Don P
      1. 0
        Kurt Z
        1. 0
          Struppi
          1. 0
            Don P
            1. 0
              Struppi
              1. 0
                Don P
                1. 0
                  Struppi
                  1. 0
                    Don P
                    1. 0
                      Struppi
                      1. 0
                        Don P
                        1. 0
                          Struppi
                          1. 0
                            Don P
                      2. 0
                        Kurt Z
                        1. 0
                          Struppi
                          1. 0
                            Kurt Z
                            1. 0
                              Struppi
                              1. 0
                                Kurt Z
                                1. 0
                                  Struppi
                                  1. 0
                                    Kurt Z
                                    1. 0
                                      LanX²
                                    2. 0
                                      Struppi
                                      1. 0
                                        Kurt Z
                                        1. 0
                                          Kurt Z
                                        2. 0
                                          Struppi
                                          1. 0
                                            Kurt Z
                              2. 0
                                Don P
              2. 0
                LanX²
                1. 0

                  Function.prototype.begetObject

                  LanX²
                  1. 0
                    Don P
                    1. 0

                      Knobelaufgabe

                      LanX²
                      1. 0
                        Don P
                    2. 0
                      molily
                      1. 0
                        Kurt Z
                        1. 0

                          Please beget it!

                          LanX²
                          1. 0
                            Kurt Z
                          2. 0
                            Don P
                            1. 0
                              LanX²
                              1. 0
                                Don P
                              2. 0

                                Iterator

                                KurtZ
                                1. 0
                                  LanX
                      2. 0
                        Don P
        2. 0

          new Object(x) statt object(x)

          Kurt Z
          1. 0
            Murphy
            1. 0
              Kurt Z
              1. 0
                Don P
              2. 0
                Murphy
                1. 0
                  Kurt Z
                2. 0
                  molily
  2. 0
    LanX²
  3. 0
    molily
  4. 3

    __proto__ chain

    LanX²
    1. 0
      LanX²
      1. 0
        Kurt Z
    2. 1
      molily
  5. 0

    JS-Version?

    Kurt Z
    1. 0
      Kurt Z
      1. 0
        molily
        1. 0
          molily
    2. 0
      molily
      1. 0
        Kurt Z
        1. 0
          molily
          1. 0
            Kurt Z
  6. 0

    VIELEN DANK!!!

    Kurt Z
    1. 0
      Struppi