Ergebnis 1 bis 11 von 11
Like Tree2Likes
  • 1 Post By tsseh
  • 1 Post By tsseh

Thema: Eigenschaft constructor wird bei Instanzierung via new nicht wie erwartet gesetzt

  1. #1
    geronimo ist offline Jungspund
    registriert
    23-07-2015
    Beiträge
    11

    Eigenschaft constructor wird bei Instanzierung via new nicht wie erwartet gesetzt

    Hallo Leute,

    habe ein Frage zur JavaScript Objekt Instanzierung via new. Ich habe 2 Codebeispiele:

    Code:
    //Bsp. 1
    var Person = function Person(){
       //...
    }
    
    var einePerson = new Person();
    
    console.log(einePerson.constructor === Person); // true
    Code:
    //Bsp. 2
    
    var Person = function Person(){
       //...
    }
    
    Person.prototype = {
    	sayHelloWorld: function(){
    		console.log("HELLO WORLD");
    	}
    }
    
    var einePerson = new Person();
    
    console.log(einePerson.constructor === Person); // false
    Warum liefert der Vergleich(jeweils letzte Codezeile) nur im 1. Beispiel true?
    Eigentlich sollte durch den Konstruktor-Aufruf doch die Eigenschaft constructor des instanzierten Objektes mit der Konstruktor-Funktion belegt werden.

    danke für eure Hilfe
    Geändert von mikdoe (23-07-2015 um 17:51 Uhr) Grund: Gelöst gesetzt

  2. #2
    tsseh ist offline Foren-Gott
    registriert
    19-05-2008
    Beiträge
    5.667

    AW: Eigenschaft constructor wird bei Instanzierung via new nicht wie erwartet gesetzt

    Zitat Zitat von geronimo Beitrag anzeigen
    Warum liefert der Vergleich(jeweils letzte Codezeile) nur im 1. Beispiel true?
    Eigentlich sollte durch den Konstruktor-Aufruf doch die Eigenschaft constructor des instanzierten Objektes mit der Konstruktor-Funktion belegt werden.
    constructor ist eine eigenschaft des prototypen, diesem weist du im 2. beispiel ein objekt zu. damit ist einePerson.constructor == Object.prototype.constructor
    jetzt kannst du entweder
    Code:
    var Person = function Person(){
       //...
    }
    
    Person.prototype.sayHelloWorld = function(){
    		console.log("HELLO WORLD");
    	};
    
    
    var einePerson = new Person();
    
    console.log(einePerson.constructor === Person);
    oder
    Code:
    var Person = function Person(){
       //...
    }
    
    Person.prototype= {
            sayHelloWorld: function(){
    		console.log("HELLO WORLD");
    	}
    Person.prototype.constructor = Person;
    
    var einePerson = new Person();
    
    console.log(einePerson.constructor === Person);
    verwenden
    geronimo likes this.

  3. #3
    geronimo ist offline Jungspund
    registriert
    23-07-2015
    Beiträge
    11

    AW: Eigenschaft constructor wird bei Instanzierung via new nicht wie erwartet gesetzt

    Danke für die Klärung!

    Ich bin aber ein wenig verwirrt, da ich dachte, dass die Eigenschaft constructor in der Konstruktor-Funktion implizit gesetzt wird. Diese Information habe ich aus folgender Quelle:JavaScript constructors, prototypes, and the `new` keyword - Pivotal Labs



    Wenn man nämlich andere Eigenschaften im Konstruktor setzt, werden diese nicht überschrieben. Bedeutet das, dass die Eigenschaft constructor nicht vom Prototypen auf das instanzierte Objekt übernommen wird und bei Aufruf von Instanz.constructor eigentlich die Eigenschaft des Prototypen zurückgegeben wird.

    Code:
    var Person = function Person(vorname, nachname){
       //implitzite setzung der eigenschaft constructor
       this.vorname = vorname;
       this.nachname = nachname;
    }
    
    Person.prototype = {
    	vorname: "allen",
    	nachname: "harper",
    	sayHelloWorld: function(){
    		console.log("HELLO WORLD");
    	}
    }
    
    var einePerson = new Person("charlie","harper");
    
    console.log(einePerson.constructor === Person); // false
    console.log(einePerson); //{ vorname: 'charlie', nachname: 'harper' }
    Danke für die Hilfe
    Geändert von geronimo (23-07-2015 um 12:03 Uhr)

  4. #4
    tsseh ist offline Foren-Gott
    registriert
    19-05-2008
    Beiträge
    5.667

    AW: Eigenschaft constructor wird bei Instanzierung via new nicht wie erwartet gesetzt

    Zitat Zitat von geronimo Beitrag anzeigen
    Bedeutet das, dass die Eigenschaft constructor nicht vom Prototypen auf das instanzierte Objekt übernommen wird und bei Aufruf von Instanz.constructor eigentlich die Eigenschaft des Prototypen zurückgegeben wird.
    das ist generell so, jede eigenschaft am prototypen wird nicht an das instanzierte objekt kopiert, das passiert erst beim schreiben(damit wird die eigenschaft am prototypen von der instanz überschrieben)

  5. #5
    geronimo ist offline Jungspund
    registriert
    23-07-2015
    Beiträge
    11

    AW: Eigenschaft constructor wird bei Instanzierung via new nicht wie erwartet gesetzt

    Ok, danke, das heißt also, sollte eine Eigenschaft im instanzierten Objekt nicht überschrieben werden, wird bei Ausgabe der Eigenschaft immer die
    des Prototypen ausgegeben.

    Code:
    //eingeschaften nicht überschrieben:
    
    console.log(einePerson.vorname === einePerson.__proto__.vorname); // true
    
    console.log(einePerson); // {}
    
    //eigenschaft überschrieben 
    einePerson.vorname = "charlie";
    console.log(einePerson.vorname === einePerson.__proto__.vorname); // false
    console.log(einePerson); // { vorname: 'charlie' }
    Bei Methoden gilt dasselbe, oder?

  6. #6
    tsseh ist offline Foren-Gott
    registriert
    19-05-2008
    Beiträge
    5.667

    AW: Eigenschaft constructor wird bei Instanzierung via new nicht wie erwartet gesetzt

    ja

  7. #7
    geronimo ist offline Jungspund
    registriert
    23-07-2015
    Beiträge
    11

    AW: Eigenschaft constructor wird bei Instanzierung via new nicht wie erwartet gesetzt

    Es hat keine Vorteile, oder Nachteile, sollte die constructor Eingeschaft einer Instanz nicht mehr auf die Konstruktorfunktion zeigen, oder?
    Also kann man die Neu-Zuweisung auch weglassen.

  8. #8
    tsseh ist offline Foren-Gott
    registriert
    19-05-2008
    Beiträge
    5.667

    AW: Eigenschaft constructor wird bei Instanzierung via new nicht wie erwartet gesetzt

    Zitat Zitat von geronimo Beitrag anzeigen
    Es hat keine Vorteile, oder Nachteile, sollte die constructor Eingeschaft einer Instanz nicht mehr auf die Konstruktorfunktion zeigen, oder?
    Also kann man die Neu-Zuweisung auch weglassen.
    kommt darauf an, ob du oder ein framework welches du nutzt das erwartet.

    noch als ergänzug zur vorhergehenden frage, bei objekten als eigenschaften musst du aufpassen

  9. #9
    geronimo ist offline Jungspund
    registriert
    23-07-2015
    Beiträge
    11

    AW: Eigenschaft constructor wird bei Instanzierung via new nicht wie erwartet gesetzt

    ok, hab das gerad getestet, konnte aber keinen unterschied zu eigenschaften, die keine objekte sind, sehen können.

    könntest du vl. ganz kurz erklären auf was man aufpassen muss?

  10. #10
    tsseh ist offline Foren-Gott
    registriert
    19-05-2008
    Beiträge
    5.667

    AW: Eigenschaft constructor wird bei Instanzierung via new nicht wie erwartet gesetzt

    wenn du am prototypen ein objekt hast, und änderst einen eigenschaft dieses objektes an einer instanz, schreibst du ja nicht auf eine bis dahin nicht existierende eigenschaft, ... boa, vielleicht einfacher als beispiel
    Code:
    Person.prototype.xxx = {
      yyy: 1
    };
    var einePerson = new Person();
    var eineAnderePerson = new Person();
    einePerson.xxx.yyy = 9;   // xxx existiert zwar nur am prototypen, da xxx aber ein Objekt und du xxx selbst nicht änderst
                                       // ist einePerson.xxx hier eine leseoperation also einePerson.xxx.yyy = 9; 
                                       // ist eigentlich einePerson.get_xxx().yyy = 9;
                                       // damit liefert einePerson.get_xxx() hier das xxx vom prototypen, bei welchem du dann yyy auf 9 setzt
    alert(eineAnderePerson.xxx.yyy) // darauf gehen aber auch alle anderen lesezugriffe
    dabei hilft objekt.create
    geronimo likes this.

  11. #11
    geronimo ist offline Jungspund
    registriert
    23-07-2015
    Beiträge
    11

    AW: Eigenschaft constructor wird bei Instanzierung via new nicht wie erwartet gesetzt

    Alles klar! danke
    gute Erklärung

Ähnliche Themen

  1. Hmm Punkt wird falsch gesetzt beim € Betrag
    Von Typhon im Forum JavaScript
    Antworten: 1
    Letzter Beitrag: 17-06-2010, 00:52
  2. Cookie wird nicht neu gesetzt
    Von Makenshi im Forum JavaScript
    Antworten: 2
    Letzter Beitrag: 29-11-2009, 23:57
  3. der focus wird nicht gesetzt
    Von ToM80 im Forum JavaScript
    Antworten: 12
    Letzter Beitrag: 12-09-2009, 13:39
  4. Attribut wird einmal gesetzt, einmal nicht
    Von Generic1 im Forum JavaScript
    Antworten: 5
    Letzter Beitrag: 20-07-2009, 13:25
  5. Antworten: 9
    Letzter Beitrag: 25-12-2007, 18:32

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •