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
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
Schöne Antwort .. Viele Dinge aus Ihrer Antwort zu nehmen :) –
@ 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