JavaScript ist die einzige weit verbreitete Sprache für die Vererbung von Prototypen. Daher braucht es Zeit, um die Unterschiede zwischen den beiden Vererbungsmethoden zu verstehen.
Der erste große Unterschied besteht darin, dass JavaScript Prototyp -Ketten verwendet, um zu erben:
Funktion foo () {this.Value = 42;} foo.prototype = {Methode: function () {}}; Funktion bar () {}Setzen Sie den Prototyp von Bar auf die Objektinstanz von FOO:
Bar.prototype = new foo (); bar.prototype.foo = 'Hallo Welt';
Stellen Sie sicher, dass der Konstruktor der Bar selbst ist, und erstellen Sie eine neue Bar -Objektinstanz:
Bar.Prototype.Constructor = bar; var test = new bar ();
Schauen wir uns die Zusammensetzung der gesamten Prototypkette an:
test [Instanz von bar] bar.prototype [Instanz von foo] {foo: 'Hallo Welt'} foo.prototype {Methode: ...} Object.Prototype {toString: ... / * usw. * /}Im obigen Beispiel erbt der Objekttest sowohl bar.prototype als auch foo.prototype. Daher kann es auf die in FOO definierte Funktionsmethode zugreifen. Natürlich kann es auch auf den Eigenschaftswert zugreifen. Es sollte erwähnt werden, dass wenn New Bar () nicht erstellt wird, eine neue FOO -Instanz wiederverwendet wird, aber die FOO -Instanz, die mit ihrem Prototypobjekt entsteht. In ähnlicher Weise teilen alle Barinstanzen das gleiche Wert -Attribut. Lassen Sie uns Beispiele geben:
test1 = neuer bar (); test2 = neuer bar (); Bar.Prototype.Value = 41; test1.Value // 41 test2.Value // 41
Prototyp -Kettensuchmechanismus
Bei dem Zugriff auf die Eigenschaften eines Objekts durchquert JavaScript die gesamte Prototypkette aus dem Objekt selbst, bis es die entsprechenden Eigenschaften findet. Wenn Sie die Oberseite der Prototyp -Kette erreichen, dh das Objekt ist. Prototyp im obigen Beispiel und immer noch keine Attribute zu finden, dann gibt JavaScript den undefinierten Wert zurück.
Eigenschaften von Prototypobjekten
Obwohl die Eigenschaften des Prototyp -Objekts von JavaScript verwendet werden, um die Prototyp -Kette zu erstellen, können wir ihnen dennoch Werte zuweisen. Das Kopieren des ursprünglichen Werts auf Prototypen ist jedoch ungültig, wie z. B.:
Funktion foo () {} foo.prototype = 1; // keine WirkungHier ist eine Ablenkung von diesem Artikel und stellen Sie vor, was der ursprüngliche Wert ist:
In JavaScript können Variablen zwei Wertearten speichern, nämlich den ursprünglichen Wert und den Referenzwert.
1. Primitiver Wert:
Die ursprünglichen Werte sind fest und einfache Werte, bei denen es sich um einfache Datensegmente handelt, die im Stapel gespeichert sind, dh ihre Werte werden direkt an dem Ort gespeichert, an dem die Variable zugegriffen wird.
Es gibt fünf Arten von primitiven Typen: Undefined, Null, Boolean, Anzahl, String.
2. Referenzwert:
Der Referenzwert ist ein relativ großes Objekt, das im Heap -Haufen gespeicherte Objekt, dh der Wert, der in der Variablen gespeichert ist, ist ein Zeigerzeiger, der auf den Speicher zeigt, in dem das Objekt gespeichert ist. Alle Referenztypen sind aus dem Objekt integriert.
Prototypen -Kettenleistungsprobleme
Wenn sich die zu findenen Attribute oben in der Prototypkette befinden, hat der Suchprozess zweifellos einen negativen Einfluss auf die Leistung. Dies ist eine wichtige Überlegung, wenn in Szenarien, in denen Leistungsanforderungen erforderlich sind, erforderlich sind. Der Versuch, eine Eigenschaft zu finden, die nicht existiert, durchquert die gesamte Prototypkette.
In ähnlicher Weise werden beim Durchqueren der Eigenschaften eines Objekts auf alle Eigenschaften der Prototypkette zugegriffen.
Zusammenfassen
Das Verständnis des Prototyps Vererbung ist die Voraussetzung für das Schreiben komplexerer JavaScript -Code, und Sie müssen auch auf die Höhe der Prototypkette im Code achten. Wenn Sie sich auf Leistungsengpässe stellen, müssen Sie lernen, die Prototyp -Kette zu teilen. Um den Prototyp -Objektprototyp vom Prototyp __Proto__ zu unterscheiden, werden wir hier hauptsächlich den Prototyp -Objektprototyp hier diskutieren und das Problem über den Prototyp __Proto__ nicht erklären.