2012-05-30 11 views
9

Ich bin sehr neu in JavaScript. Ich lese von JavaScript gute Teile. Dort heißt es:Warum Funktionen Prototyp ist wiederholt angekettet?

Jede Funktion Objekt auch mit einem Prototyp Eigenschaft

ich so etwas wie das hat so erstellt:

function test() { 
} 

console.log(test.prototype); 

Mit Chrome-Entwickler-Tools, finde ich den Ausgang wie folgt:

enter image description here

Ich bin wirklich mit dieser Ausgabe verwirrt. Warum ist die Eigenschaft constructor wieder mit constructor verschachtelt? Und warum geht das so weiter wie eine Kette? Wo fehlt mir das Konzept?

Vielen Dank im Voraus.

Antwort

9

Die Eigenschaft einer Funktion enthält das Objekt, von dem alle Instanzen dieser Funktion erben, wenn sie mit dem Operator new erstellt werden. Und all diese Prototyp-Objekte haben (normalerweise) eine constructor Eigenschaft, die auf die Funktion verweist - dort haben Sie den Zirkelbezug. Also, new test() erbt diese Eigenschaft, (new test).constructor === test wertet true aus.

Sie müssen zwischen der -Eigenschaft eines Funktionsobjekts und dem Prototypobjekt unterscheiden, von dem ein Objekt erbt - oft als "die interne [[prototype]]-Eigenschaft" bezeichnet.

Ein Konstruktor ist eine Funktion, um nicht zu sagen Function, und hat beides. Daher erbt es von dem Objekt Function.prototype - wo die constructor Eigenschaft besagt, dass alle Funktionen von dem Function Konstruktor erstellt werden. Wenn Ihre Entwicklerkonsole den Prototyp der Function Objekte anzeigen würde, könnten Sie sie sehen. Ich denke, es gibt eine Option in den Einstellungen.

die berühmte „Prototypkette“ ist also nicht um die constructor und/oder prototype Eigenschaften, sondern über das Prototyp-Objekt, von dem das Objekt erbt von:

function test() {}    new test() 
    (a Function)    (a test instance) 
     ||       || 
     ||       || 
     \/       \/ 
Function.prototype   test.prototype 
(a Function, by spec)   (an Object) 
     ||       || 
     ||       || 
     \/       \/ 
Object.prototype    Object.prototype 
     ||       || 
     ||       || 
     \/       \/ 
     null       null 
+0

Danke für den Link, ich habe mich schon gefragt über die Ausgabe beim schnellen Überprüfen von 'Object.getPrototypeOf (test)' in der Konsole ... – Bergi

+0

Schöne Antwort .. Viele Dinge aus Ihrer Antwort zu nehmen :) –

+0

@ Bergi- Bitte erklären Sie - "Ein Konstruktor ist eine Funktion, um nicht eine Funktion zu sagen, und hat beide. Daher erbt er vom Function.prototype Objekt" – jason

2

Das ist eine der sehr guten Bücher abholen.

Es deckt mehr von Javascript aus Programmierersicht alle objektorientierten Techniken abdecken und die meisten Dinge darin sind nicht in anderen Büchern über Javascript abgedeckt.

Und über Prototyp. Jedes Objekt in JavaScript enthält einen verborgenen Zustand - einen Verweis auf ein anderes Objekt, das als Prototyp des Objekts bezeichnet wird. Prototype-Objekte in JavaScript geben uns die Vererbung, und sie ermöglichen uns, Methodenimplementierungen zu teilen. Prototypen ketten auch. Mit anderen Worten, da ein Prototypobjekt nur ein Objekt ist, kann ein Prototypobjekt eine Referenz auf ein anderes Prototypobjekt beibehalten.

Prototyp in Javascript ist wenig komplizierter Teil, wie ich es beim Lernen erfahren habe.

Dies ist eine großartige reference zu wissen, wie Prototyp in Js funktioniert.

+0

Diese Referenz war fantastisch, danke. – keyser

+0

Danke für die +1 :) – Katti

Verwandte Themen