2016-04-26 13 views
2

Ich möchte den Unterschied kennen zwischen:Was ist der Unterschied zwischen childObj.prototype = Object.create (parentObj.prototype) und childObj.prototype = parentObj.prototype?

childObj.prototype = Object.create(parentObj.prototype) 

und

childObj.prototype = parentObj.prototype; 

Da beide Ich brauche den Eltern Konstruktor innerhalb des Kindes Objekt aufzurufen Zugang zu den Konstruktor Eigenschaften zu haben.

Ich weiß, wie Object.create Funktion funktioniert, und ich stelle fest, dass der Unterschied nur besteht, weil es ein neues Objekt mit der mit dem Prototyp der Eltern zurückgibt. Ich denke, was ich nicht verstehe, ist der Effekt der Rückgabe eines neuen Objekts mit dem Prototyp des Elternteils.

+0

Die erste erstellt eine Prototyp-Kette, wo Sie child.prototype nach ändern können und es nicht die Eltern beeinflussen. Die zweite ist buchstäblich Aliasing der beiden, um auf die gleiche Datenstruktur zu zeigen, und Modifikationen durch entweder ändern diese einzelne Datenstruktur, beide betroffen. Sie wollen die erste, obwohl Sie normalerweise 'ChildObj.prototype = new ParentObj()' anstelle von Object.create benötigen –

+0

* obwohl Sie normalerweise wollen ChildObj.prototype = new ParentObj() '* Wahrscheinlich nicht, da dies die' ruft ParentObj' Konstruktor beim Zuweisen der '.prototype' zu ​​seinem Kind, NICHT wenn eine neue Instanz erstellt wird. – nils

Antwort

2

Ihre erste Probe ist der richtige Weg, um darüber zu gehen, da es ein neues Objekt mit den parentObj.prototype als [[Prototype]] schafft:

childObj.prototype = Object.create(parentObj.prototype); // { __proto__: parentObj.prototype } 

Die zweite setzt nur childObj.prototype auf das gleiche Objekt wie die parentObj.prototype. Dies verursacht einige Probleme:

function parentObj() { 
} 

parentObj.prototype.parentFn = function() { console.log('parent'); }; 


function childObj() { 
} 

childObj.prototype = parentObj.prototype; 

// here we are writing onto parentObj.prototype as well!!! 
childObj.prototype.childFn = function() { console.log('child'); }; 

var child = new childObj(); 

var parent = new childObj(); 

child.parentFn(); // 'parent' 
parent.childFn(); // 'child' --- this should not happen!!! 

In das Objekt direkt zuweisen, wir auf die Mutter .prototype geschrieben haben.

2

Grundsätzlich ist Object.create der erste Parameter der Prototyp und der zweite Parameter ist das Eigenschaftendeskriptor-Objekt. Daher, wenn Sie das Bestehen des Prototyp Objekt an die Object.create allein, Ein Objekt ohne eigene Eigenschaften geschaffen würde und das bestandenen Objekt würde die __proto__ des neu geschaffene Objekts zugeordnet werden.

Aber wenn Sie den Prototyp des Elterns dem Kind zuweisen, werden die Referenzen einfach überlappt. Und es wird keine strukturelle Veränderung im Objekt geben.

+0

@ downvoter pflege zu kommentieren? Damit ich hier mein falsches Verständnis korrigieren konnte. Vielen Dank –

1

Ein Unterschied, den ich denken kann, ist dies:
Sie

c = new childObj() 
p = new parentObj() 

in beiden Fällen haben vorausgesetzt, Sie

c instanceof parentObj === true 

aber im zweiten Fall haben, werde auch

haben Sie
p instanceof childObj === true 

whild im ersten Fall haben Sie

p instanceof childObj === false