VorwortDas Wissen über Prototypen und Prototypenketten stand bei Interviews immer im Mittelpunkt. Es ist nicht allzu schwierig, aber es erfordert dennoch einige Anstrengung, es vollständig zu verstehen. Um Ihr Interesse zu wecken, werfen wir einen Blick auf eine Interviewfrage: Funktion Benutzer() {} Benutzer.prototype.sayHello = Funktion() {} var u1 = neuer Benutzer(); var u2 = neuer Benutzer(); Konsole.log(u1.sayHello === u2.sayHello); console.log(Benutzer.Prototyp.Konstruktor); console.log(Benutzer.prototyp === Funktion.prototyp); console.log(Benutzer.__proto__ === Funktion.prototyp); console.log(Benutzer.__proto__ === Funktion.__proto__); Konsole.log(u1.__proto__ === u2.__proto__); console.log(u1.__proto__ === Benutzer.__proto__); Konsole.log(Funktion.__proto__ === Objekt.__proto__); Konsole.log(Funktion.prototype.__proto__ === Objekt.prototype.__proto__); Konsole.log(Funktion.prototype.__proto__ === Objekt.prototype); Den Grundstein legenAlle JavaScript-Objekte werden grundsätzlich durch die neue Funktion erstellt, einschließlich Objekte, die in Form von Objektliteralen definiert sind (entspricht dem syntaktischen Zucker von new Object()). Alle Funktionen werden grundsätzlich über eine neue Funktion erstellt, einschließlich Objekt, Array usw. Alle Funktionen sind Objekte. PrototypJede Funktion hat einen Eigenschaftsprototyp, der den Prototyp darstellt. Standardmäßig ist es ein gewöhnliches Object-Objekt, das der Prototyp der durch Aufruf des Konstruktors erstellten Instanz ist. Konstruktor-EigenschaftenJavaScript hat auch eine Eigenschaft, die auf den Konstruktor vom Prototyp verweist: Konstruktor, d. h. Func.prototype.constructor --> Func __proto__Alle Objekte in JavaScript (außer null) haben eine __proto__-Eigenschaft, die auf den Prototyp des Objekts verweist. Funktion Benutzer() {} var u1 = neuer Benutzer(); // u1.__proto__ -> Benutzer.prototyp console.log(u1.__proto__ === Benutzer.prototyp) // wahr Offensichtlich verweist die __proto__-Eigenschaft der Instanz auf den Prototyp des Konstruktors. Verweist also das __proto__ mehrerer Instanzen auf denselben Prototyp? var u2 = neuer Benutzer(); console.log(u1.__proto__ === u2.__proto__) // wahr Wenn alle __proto__ mehrerer Instanzen auf den Prototyp des Konstruktors verweisen und die Instanzen auf eine bestimmte Weise auf die Methoden, Eigenschaften usw. des Prototyps zugreifen können, können sie auf dem Prototyp programmieren und den Effekt der Vererbung erzielen. Lassen Sie uns weiterhin das Beziehungsdiagramm zwischen Prototypen und Prototypketten aktualisieren: PrototypenketteWenn ein Instanzobjekt nach einem Attribut sucht und es nicht finden kann, folgt es __proto__, um nach dem mit dem Objekt verknüpften Prototyp zu suchen. Wenn es ihn immer noch nicht finden kann, sucht es nach dem Prototyp des Prototyps, bis es die oberste Ebene findet. Dies ist das Konzept der Prototypenkette. Schauen wir uns einige Beispiele für Prototypketten anhand von Interviewfragen an: Beispiel
verbessernNachdem Sie das oben Gesagte gelernt haben, können die meisten Interviewfragen beantwortet werden, wie zum Beispiel die folgenden Funktion A() {} Funktion B(a) { dies.a = a; } Funktion C(a) { wenn (a) { dies.a = a; } } A.Prototyp.a = 1; B.prototyp.a = 1; C.prototyp.a = 1; konsole.log(neu A().a); //1 console.log(new B().a); //undefiniert konsole.log(neu C(2).a); //2 Es fehlt jedoch noch etwas zur Lösung der ursprünglichen Interviewfragen im Artikel, wie z. B. Function.__proto__ === Object.__proto__, Function.prototype.__proto__ === Object.prototype.__proto__ usw. Lassen Sie uns diese nacheinander angehen. Objekt.__proto__ , Objekt.prototype, Objekt.prototype.__proto__
// Zusammenfassen: Objekt.__proto__ --> Funktion.prototype Objekt.prototype.__proto__ --> null Funktion.__proto__, Funktion.prototyp, Funktion.prototyp.__proto__
Die Praxis zeigt, dass es nur Object.__proto__ --> Function.prototype gibt Ich habe lange nachgedacht, bin aber zu keinem Ergebnis gekommen. Könnte es sein, dass Function ein Affe ist, der zwischen den Felsen hervorspringt? Ich habe also eine Reihe von Tests durchgeführt und unerwartet einen Hinweis gefunden. Aus dem Obigen können wir schließen: Function.__proto__ --> Function.prototype
ZusammenfassenAbschließend werden die Erkenntnisse über Prototypen und Prototypenketten in einem Bild verdichtet:
NachwortDer Ozean des Wissens ist oft größer, als man denkt. Ich habe Prototypen und Prototypenketten viele Male studiert und denke, dass ich sie umfassender und vollständiger gelernt habe. Aber als ich auf diese Interviewfrage stieß, wurde mir klar, dass das, was ich gelernt hatte, nur ein Zweig war und dass es in JS wirklich viele tiefe Schätze gibt, die darauf warten, ausgegraben zu werden. Das Lernen hat kein Ende, lasst uns einander ermutigen. Zum Schluss noch eine einfache Interviewfrage, die Ihr Selbstvertrauen stärkt: var F = Funktion () {} Objekt.prototype.a = Funktion () {} Funktion.prototype.b = Funktion () {} var f = neues F(); Konsole.log(fa, fb, Fa, Fb); // Prototypenkette // f.__proto__ --> F.prototype --> Object.prototype // F.__proto__ --> Funktion.prototyp --> Objekt.prototyp Dies ist das Ende dieses Artikels über JavaScript-Prototypen und Prototypenketten. Weitere relevante Inhalte zu JavaScript-Prototypen und Prototypenketten finden Sie in früheren Artikeln auf 123WORDPRESS.COM oder in den folgenden verwandten Artikeln. Ich hoffe, dass jeder 123WORDPRESS.COM in Zukunft unterstützen wird! Das könnte Sie auch interessieren:
|
<<: CSS-Standard: Eigenschaft „vertical-align“
>>: Analyse des Consul-Konfigurationsprozesses für die Docker-Bereitstellung
Frage Wenn wir bei der normalen Entwicklung das P...
Inhaltsverzeichnis 01-Ereignisse brodeln 1.1- Ein...
1. Quellcode entwerfen Code kopieren Der Code laut...
Die goldene Regel Befolgen Sie immer die gleichen...
Docker-Lernen https://www.cnblogs.com/poloyy/p/15...
Linux wird von immer mehr Benutzern geliebt. Waru...
Inhaltsverzeichnis Vorwort 1. Herkömmliche Vue-Ko...
1. Suchen Sie im Browser nach MySQL, um es herunt...
In diesem Artikel wird die spezifische Methode zu...
Dieser Artikel beschreibt, wie man den https-Dien...
Vorwort Ich bin kürzlich bei der Arbeit auf ein P...
Direkt zur Konfigurationsdatei Server { listen 80...
Bei der Frontend-Entwicklung stehen wir in direkt...
In diesem Artikel wird der spezifische JavaScript...
Problembeschreibung: Der Benutzer hat die Anforde...