• Das Erstellen neuer Accounts wurde ausgesetzt. Bei berechtigtem Interesse bitte Kontaktaufnahme über die üblichen Wege. Beste Grüße der Admin

[GELÖST] Eigenschaft constructor wird bei Instanzierung via new nicht wie erwartet gesetzt

geronimo

New member
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
 
Zuletzt bearbeitet von einem Moderator:
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
 
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
 
Zuletzt bearbeitet:
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)
 
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?
 
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.
 
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
 
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?
 
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
 
Zurück
Oben