Bevor wir über Prototypungsketten sprechen, müssen wir zunächst verstehen, in welcher Beziehung sich die Beziehung zwischen benutzerdefinierten Funktionen und Funktionen hat, und welche untrennbaren Beziehungen zwischen Konstruktoren, Prototypen und Instanzen sind? Tatsächlich sind alle Funktionen Funktionen. Es gibt einen Prototyp -Eigenschaftsprototyp am Konstruktor, der ebenfalls ein Objekt ist. Dann befindet sich eine Konstruktoreigenschaft auf dem Prototypobjekt, das auf den Konstruktor verweist. und es gibt eine _proto_ -Eigenschaft auf dem Instanzobjekt, das auch auf das Prototyp -Objekt hinweist, und diese Eigenschaft ist keine Standardeigenschaft und kann in der Programmierung nicht verwendet werden. Diese Eigenschaft wird intern für die Verwendung von Browser verwendet.
// _proto_ Es gibt einen Eigenschaftsprototyp in der Funktion. Das von dieser Funktion erstellte Objekt wird standardmäßig mit der Eigenschaft verbunden. // Die Beziehung zwischen Prototyp und _Proto___ stammt aus der Objektperspektive, Prototyp stammt aus der Konstruktorperspektive.
Schauen wir uns unten das Bild an und sprechen wir.
1. Die Beziehung zwischen Konstruktor, Prototyp und Instanz
①+Objekt
②+Funktion+Objekt+Array
Lassen Sie uns nach dem Verständnis diskutieren, was eine Prototypkette ist. Um es unverblümt auszudrücken, handelt es sich tatsächlich um eine endliche Kette, die zwischen einem endlichen Instanzobjekt und einem Prototyp gebildet wird, das zur Implementierung gemeinsamer Attribute und der Vererbung verwendet wird. Schauen wir uns als nächstes den Code an, um zu sprechen.
var obj = neues Objekt (); Das Objekt ist ein Prototyp -Objekt mit einem Prototyp -Objekt und einem Prototyp -Objekt obj._proto _._ Proto _._ Proto _._ proto__Proto_ hat auch ein Prototyp -Objekt. Das Prototypobjekt des Objekts schaut immer wieder auf und Sie finden einen Null // Prototyp -Kettenbeispiel var arr = []. arr -> Array.Prototyp -> Object.Prototyp -> null var o = new Object (); O -> Object.Prototyp -> null; Funktion foo1 () {this.name1 = '1';} Funktion foo2 () {this.name2 = '2';} foo2.Prototype = neofoo1 (); Funktion foo3 () {this.name = '3';} foo3.Prototype = neo foo2 (); var foo3 = new foo3 ();Als nächstes kommt das Erbschaftsproblem.
2. Vererbung
1) Prototyp -Vererbung
Funktion Animal (Name) {this.name = name; } Funktion Tiger (Farbe) {this.color = color; } // var tiger = new Tiger ('gelb'); // console.log (tiger.color); // console.log (tiger.name); // undefined // Tiger.Prototype = new Animal ('Tiger'); // One Way Object.Prototype.Name = 'Big Tiger'; // der zweite Weg var tiger = neuer Tiger ('gelb'); console.log (Tiger.Color); console.log (tiger.name);Es ist erwähnenswert, dass es hier zwei Hauptprobleme gibt: ① Es ist nicht bequem, Parameter an den übergeordneten Typ zu übergeben. ② Die Referenztypen im übergeordneten Typ werden von allen Instanzen gemeinsam genutzt
2) ES5 liefert die Methode des Objekts.Create () zur Implementierung der Vererbung
- kompatibel // Shim Shim -Funktion erstellen (obj) {if (Object.create) {return Object.create (obj); } else {function foo () {} foo.prototype = obj; Neue Foo () zurückgeben; }}Diese Methode ist ein neues Merkmal von ES5, das tatsächlich kopiert und erbt.
3) Erbschaft kopieren
var obj = {}; obj.extend = function (obj) {für (var k in obj) {this [k] = obj [k]; }}4) Erbschaftskonstruktor -Konstruktor - Die Mitglieder des Prototyps im geliehenen Konstruktor werden nicht geliehen
Funktion Animal (Name) {this.name = name;} Funktion Maus (Spitzname) {Animal.call (this, 'Maus'); this.nickname = spickname;} var m = new Maus ('Jerry'); console.log (M.Name); console.log (M.Nickname);Bestehendes Problem: Es kann das Problem der Übergabe von Parametern im Prototyperbschaft lösen, die Mitglieder (Attribute und Methoden) im Prototypobjekt im übergeordneten Typ können jedoch nicht vererbt werden
5) Kombinationsvererbungs-Prototyp-Objekt ist dynamisch
Funktionsperson (Name) {this.name = name;} Person.Prototype.Showname = function () {console.log (this.name); this.age = Age;} student.Prototype = new Person (); Student.Prototype.Constructor = student; student.Prototype.Showage = function () {console.log (this.age);} var stu = new student ('zhang san', 12); stu.showname (); stu.showage ();[Prototypenvereritz + Ausleihe -Konstruktor -Vererbung] Seine Merkmal
[Zusammenfassung] Um es in einen sehr schwierigen Satz zu bringen, ist die sogenannte Prototypkette ein Verhalten, eine Mutter zu finden, und es kann verstanden werden, dass Menschen von Menschen geboren werden und Dämonen von Dämonen geboren werden. Es gibt tatsächlich nur einen Kern der Prototyp -Kette: Attributfreigabe und unabhängige Kontrolle. Wenn Ihre Objektinstanz unabhängige Attribute benötigt, besteht die Essenz aller Praktiken darin, Attribute in der Objektinstanz zu erstellen. Wenn Sie nicht zu viel denken, können Sie die unabhängigen Attribute, die Sie persönlich benötigen, direkt definieren, um die Eigenschaften des Prototyps zu überschreiben. Kurz gesagt, bei der Verwendung von Prototyp -Vererbung sollten Sie den Attributen im Prototyp besondere Aufmerksamkeit schenken, da es sich um alle Existenzen handelt, die den ganzen Körper beeinflussen. Die häufigste Methode ist der Kombinationsmodus.
1. Prototyp -Kette
1) Die Beziehung zwischen Konstruktor, Prototyp und Instanz
①Der Konstruktor hat einen Eigenschaftsprototyp, bei dem es sich um ein Objekt handelt (eine Instanz eines Objekts). ②Das Prototyp -Objekt hat ein Konstruktorattribut, das auf die Konstruktorfunktion hinweist, zu der das Prototyp -Objekt gehört. ③Das Instanzobjekt hat ein _proto_ -Attribut, das auch auf das Prototypobjekt des Konstruktors zeigt. Es ist eine nicht standardmäßige Eigenschaft und kann nicht für die Programmierung verwendet werden. Es wird vom Browser selbst verwendet. 2) die Beziehung zwischen Prototyp und _Proto_
①Prototyp ist eine Eigenschaft des Konstruktors
②_Proto_ ist das Attribut des Instanzobjekts
- Beide verweisen auf dasselbe Objekt
[Zusammenfassung] i) Funktionen sind auch Objekte, und Objekte sind nicht unbedingt Funktionen;
ii) die Essenz eines Objekts: ein ungeordneter Satz von Schlüsselwertpaaren; Die Werte in den Schlüsselwertpaaren können Werte eines beliebigen Datentyps sein
iii) Objekt ist ein Behälter, und der Container enthält (Eigenschaften und Methoden)
3) Attributsuche
① Wenn Sie auf ein Mitglied des Objekts zugreifen, suchen Sie zunächst, ob es im Objekt vorhanden ist.
② Wenn es kein aktuelles Objekt gibt, suchen Sie im Prototypobjekt des Konstruktors danach.
③ Wenn das Prototyp -Objekt nicht gefunden wird, suchen Sie nach dem Prototyp des Prototyp -Objekts
④ Wisse, dass der Prototyp des Objektprototypobjekts null ist
2. Funktion
- Alle Funktionen sind Funktionsfälle
① Lokales Objekt: Objekt unabhängig von der Hostumgebung (Browser) - einschließlich Objekt, Array, Datum, Regexp, Funktion, Fehler, Nummer, String, boolean
② Integrierte Objekte - einschließlich Mathematik und globales (Fenster, eine globale Variable in JS), und bei der Verwendung ist nicht erforderlich.
③Host -Objekt - einschließlich benutzerdefinierter Objekte, DOM, BOM
Das obige ist die vollständige Beschreibung, wie Sie die Ihnen vorgestellte JS -Prototyp -Kette verstehen können. Ich hoffe, es wird Ihnen hilfreich sein. Wenn Sie Fragen haben, hinterlassen Sie mir bitte eine Nachricht und der Editor wird Ihnen rechtzeitig antworten. Vielen Dank für Ihre Unterstützung auf der Wulin.com -Website!