2016-07-14 6 views
1

Ich lese this article über constructor Eigentum und es besagt Folgendes:MDN Konstruktoreigenschaft Erklärung Verwirrung

Gibt einen Verweis auf die Objektfunktion, die die Prototyp der Instanz erstellt.

Und sie geben ein Beispiel:

function Tree(name) { 
    this.name = name; 
} 

var theTree = new Tree('Redwood'); 
console.log('theTree.constructor is ' + theTree.constructor); 

Hier die Instanz theTree und sein Prototyp ist Object.getPrototypeOf(theTree), die Object-Funktion ist, nicht Tree. Was verstehe ich falsch?

+0

Nun, 'Tree' * ist * eine" Objektfunktion ". Es hängt wahrscheinlich nur von den Einzelheiten Ihrer Debugging-Umgebung/Browser ab, ob der Name zu "Baum" oder nur dieser generischen "Objektfunktion" aufgelöst und angezeigt wird. – deceze

+0

@deceze, aber 'Tree' hat' theTree's Prototyp nicht erstellt, es hat die Instanz erstellt. Dies ist ein verwirrender Teil. –

+0

In 'console.log()' darfst du kein Material in String streamen, es verbirgt wichtige Details. –

Antwort

2

Der Prototyp eines Objekts wird typischerweise von seiner -Konstruktorfunktion geerbt:

function Tree() {} 
Tree.prototype.foo = function() {}; 

var theTree = new Tree(); 

theTree hat jetzt theTree.foo von seiner Prototypkette. Die function Tree initialisiert das Objekt und ist auch für den Inhalt seiner Prototypkette verantwortlich. Deshalb geben sie es als "die Objektfunktion aus, die den Prototyp der Instanz erstellte".

+0

Ich sehe jetzt, danke. Also ist die Konstruktoreigenschaft eher relevant, um herauszufinden, woher der Prototyp des Objekts kam, und um zu verstehen, welche Funktion zum Erstellen eines Objekts verwendet wurde? –

+0

Ich denke, es ist fraglich, ob MDN diesen Satz auf eine einfachere Weise schreiben könnte. Was ".constructor" für "relevanter" ist, hängt davon ab, wofür Sie es verwenden möchten. und ganz ehrlich, ich hatte nie die Notwendigkeit, es für irgendetwas bisher zu verwenden, also bin ich nicht in der besten Position, das zu kommentieren. – deceze

+0

Ich sehe, danke. Ich denke, dass es für "Prototyp" relevant sein könnte, da es in Vererbungsüberprüfungen wie diesem TreeThree verwendet werden kann, und wenn Tree den Prototyp fürTheTree erstellte, muss sichTree.Prototype inTheTree befinden 's Prototyp-Kette. Halten Sie diese Annahme für gut genug? –

0

Object.getPrototypeOf (theTree) ist der Prototyp des Tree-Funktion

Object.getPrototypeOf(theTree) == Tree.prototype; // true 

Beide beziehen sich auf das gleiche Objekt

Und Tree.prototype hat die Eigenschaft ‚Konstruktor‘ genannt, die infact eine Referenz die Baumfunktion nur

theTree.contructor == Tree.prototype.constructor ;// true 

theTree Grundsätzlich hat ein proto-Link (____proto____), und diese proto Anlenkpunkte an den Tree.prototype. Also, wenn Sie theTree.constructor es folgt tatsächlich die Proto-Link und erreicht Tree.prototype und findet den Konstruktor, der es selbst Tree-Funktion