Prototyp, jedes Funktionsobjekt verfügt über ein angezeigtes Prototypattribut, das den Prototyp des Objekts darstellt (Ausnahme ist das Funktionsobjekt Function.prototype, das kein Prototypattribut hat).
__proto__: Jedes Objekt verfügt über ein internes verstecktes Attribut namens __proto__, das auf das entsprechende Prototypobjekt verweist (der Name lautet __proto__ in Chrome und Firefox und kann aufgerufen werden). Die Prototypenkette wird basierend auf __proto__
gebildet
(Hinweis: Basiert nicht auf dem Eigenschaftsprototyp des Funktionsobjekts).
Um es einfach auszudrücken: __proto__ ist der interne Prototyp und Prototyp ist der Konstruktor-Prototyp (der Konstruktor ist eigentlich eine Funktion)
Der Prototyp des Konstruktors ist ein Objekt
Was ist also ein Konstruktor?
Um ein Objekt zu erstellen, müssen Sie zunächst einen Objektkonstruktor haben, genau wie in PHP. Wenn Sie ein Objekt erstellen möchten, müssen Sie zunächst eine Klasse haben
Die Essenz eines Konstruktors ist eine Funktion. Die folgende Frage lautet: Wie erstelle ich ein Objekt mit diesem Konstruktor?
Antwort: neu
Der Konstruktor erstellt ein Objekt.
1. Das __proto__ aller Konstruktoren/Funktionen zeigt auf Function.prototype, eine leere Funktion (leere Funktion)
Number.__proto__ === Function.prototype
// wahr
Boolean.__proto__ === Function.prototype
// wahr
String.__proto__ === Function.prototype
// wahr
Object.__proto__ === Function.prototype
// wahr
Function.__proto__ === Function.prototype
// wahr
Array.__proto__ ===
Function.prototype
// wahr
RegExp.__proto__ === Function.prototype
// wahr
Fehler.__proto__ ===
Function.prototype
// wahr
Datum.__proto__ ===
Function.prototype
// wahr
erklärt, dass Number usw. alle Konstruktoren sind und diese Konstruktoren tatsächlich ein Objekt der Funktion sind. Mit anderen Worten, es entspricht var Number = new Function();
Es gibt insgesamt 12 integrierte Konstruktoren/Objekte in JavaScript (JSON wurde in ES5 neu hinzugefügt). Hier sind 8 zugängliche Konstruktoren. Auf den Rest wie Global kann nicht direkt zugegriffen werden. Argumente werden nur von der JS-Engine erstellt, wenn die Funktion aufgerufen wird. Mathematik und JSON liegen in Form von Objekten vor und erfordern keine neuen. Ihr __proto__ ist Object.prototype. Wie folgt
Math.__proto__ === Object.prototype
// wahr
JSON.__proto__ === Object.prototype
// wahr
Zu den oben genannten „alle Konstruktoren/Funktionen“ gehören sicherlich auch benutzerdefinierte Konstruktoren/Funktionen. Wie folgt
// Funktionsdeklaration
Funktion Person()
{}
// Funktionsausdruck
var Mann
=
Funktion()
{}
console.log(Person.__proto__ === Function.prototype)
// wahr
console.log(Man.__proto__ ===
Function.prototype)
// wahr
Was bedeutet das?
Alle Konstruktoren stammen von Function.prototype, sogar der Root-Konstruktor Object und Function selbst. Alle Konstruktoren erben die Eigenschaften und Methoden von Function.prototype. Wie Länge, Aufruf, Anwenden, Binden (ES5).
Function.prototype ist auch der einzige Prototyp, dessen Typ von XXX.prototype „Funktion“ ist. Der Prototyp anderer Konstrukteure ist ein Objekt. Wie folgt
console.log(typeof Function.prototype)
// Funktion
console.log(typeof Object.prototype)
// Objekt
console.log(typeof Number.prototype)
// Objekt
console.log(typeof Boolean.prototype)
// Objekt
console.log(typeof String.prototype)
// Objekt
console.log(typeof Array.prototype)
// Objekt
console.log(typeof RegExp.prototype)
// Objekt
console.log(typeof Error.prototype)
// Objekt
console.log(typeof Date.prototype)
// Objekt
console.log(typeof Object.prototype)
// Objekt
Oh, oben wurde auch erwähnt, dass es sich um eine leere Funktion handelt. Werfen wir einen Blick auf Alert(Function.prototype).
Wir wissen, dass der __proto__ aller Konstruktoren (einschließlich integrierter und benutzerdefinierter) Function.prototype ist. Wer ist also der __proto__ von Function.prototype?
Ich glaube, Sie haben gehört, dass Funktionen in JavaScript ebenfalls erstklassige Bürger sind. Wo können Sie das also zeigen? Wie folgt
console.log(Function.prototype.__proto__ ===
Object.prototype)
// wahr
Dies zeigt, dass alle Konstruktoren auch gewöhnliche JS-Objekte sind und dem Konstruktor Attribute hinzugefügt/entfernt werden können. Gleichzeitig erbt es auch alle Methoden von Object.prototype: toString, valueOf, hasOwnProperty usw.
Wer ist der __proto__ von Object.prototype?
Object.prototype.__proto__ ===
null //
wahr
Lassen Sie mich ein Speicherbeziehungsdiagramm von Funktion, Objekt, Prototyp und __proto__ mit Ihnen teilen