molily: __proto__ chain

Beitrag lesen

Hallo,

hier hast du class1.prototype neu von class0 instanziert und mit einem neuen Objekt überschrieben! instance.prototype.__proto__ verweist aber noch auf das alte Objekt.

Das stimmt.

Übrigens ist __proto__ eine Mozilla-proprietäre Sache, die es in ECMAScript und anderen Browsern nicht gibt. Sie spiegelt aber die interne ECMAScript-Eigenschaft [[Prototype]] wieder, soweit ich weiß, insofern ist der Hinweis sehr nützlich.

Dre Knackpunkt ist aber, WANN diese Eigenschaft gesetzt wird. Sie wird nämlich nur einmal gesetzt, und zwar in dem Moment, in dem die Instanz mit new erzeugt wird. Der new-Operator ruft [[Construct]] auf: http://bclary.com/log/2004/11/07/#a-13.2.2
Darin wird die [[Prototype]]-Eigenschaft der Instanz auf das gegenwärtige prototype-Objekt des Konstruktors gesetzt (referenziert, wie du sagst).

Die Ursache ist also nichts anderes, als auch dieses Beispiel illustriert:

prot1 = {}  
ref = prot1;  
prot2 = {};

Jetzt ist ref natürlich noch prot1. Und das Objekt formally known as prot1 wird nicht vom Garbage Collector abgeräumt, weil noch eine Variable darauf verweist.

leider weiß ich auch gerade nicht wie man in JS eine explizite Objekt_ID eines Objektes abfragt um das Verhalten zu überprüfen.

Man kann die Identität von Objekten mit == bzw. === prüfen.

function Konstruktor () {}  
  
var instanz1 = new Konstruktor;  
Konstruktor.prototype = {  
 neueEigenschaft : true  
};  
var instanz2 = new Konstruktor;  
  
alert(instanz1.constructor + "\n" + instanz2.constructor);  
alert(instanz1.constructor === instanz2.constructor);  
alert(instanz1.constructor.prototype === instanz2.constructor.prototype);  
alert(Konstruktor.prototype.isPrototypeOf(instanz1) + " " + Konstruktor.prototype.isPrototypeOf(instanz2));  
alert(instanz1.__proto__ === instanz2.__proto__);  
alert(instanz1.neueEigenschaft + "\n" + instanz2.neueEigenschaft);

Offenbar wird mit der Zuweisung an prototype auch die constructor-Eigenschaft überschrieben. Logisch, dann stimmt der Prototyp auch nicht mehr überein. Was ist denn, wenn wir die constructor-Eigenschaft wieder explizit setzen?

Konstruktor.prototype = {  
 neueEigenschaft : true,  
 constructor : Konstruktor  
};

Dann stimmen zwar die constructor-Eigenschaften von instanz1 und isntanz2 überein und folglich dessen prototype-Eigenschaft. Aber neueEigenschaft gibts immer noch nur bei instanz2. Denn die __proto__- bzw. [[Prototype]]-Eigenschaften unterscheiden sich noch. instanz1.__proto__ ist ein leeres Object, instanz2.__proto__ hat logischerweise zwei Member. Dementsprechend ist Konstruktor.prototype.isPrototypeOf(instanz1) false.

Mathias

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