Ein Prototyp wird verwendet, um Eigenschaften und Methoden für eine Klasse von Objekten zu deklarieren. Ein Vorteil der Verwendung eines Prototyps besteht darin, dass Speicher gespart wird, da alle Instanzen einer Klasse auf die Eigenschaften und Methoden des Prototyps verweisen, die Speicher sparen und es ermöglichen, dass Eigenschaften von allen Instanzen einer Klasse als statisch behandelt werden.
Prototyp wird für die Vererbung durch Prototypverkettung verwendet.
Meine Frage ist sehr einfach. Warum überhaupt einen Prototyp verwenden, wenn Sie es einfach tun können:
%Vor%Stimmt das? Der primäre Zweck von Prototypen ist also dreifach:
Speicher sparen
Ja, wenn Sie Hunderte von Instanzen von Auto erstellen und alle ihre eigenen Funktionen haben (die ihre eigenen Abschlussbereiche haben), verbrauchen Sie mehr Speicher.
Es kann keine Referenz gefunden werden, aber es wurde vorgeschlagen, dass Chrome Konstruktorfunktionen optimiert, die einen Prototyp besser als Konstruktorfunktionen mit allem im Konstruktorkörper verwenden.
bieten statische Eigenschaften
Statisch ist mehr wie Date.now()
, jede Instanz hat Mitglieder vom Prototyp, kann aber für die Instanz aufgerufen werden.
ist die einzige Möglichkeit für einen Referenztyp, von einer Superklasse zu übernehmen
Sie können mit Parent.apply(this,arguments);
in Child erben, aber das macht die Erweiterung von Parent-Funktionen komplizierter und macht childInstance instanceof Parent
nicht wahr. Was dieser Code tut, ist Parent-Code mit der zu erstellenden Child-Instanz als aufrufendes Objekt ( this
). Vererbung wird normalerweise an 2 Stellen durchgeführt.
Parent.apply(this,arguments);
wird der Parent-Initialisierungscode erneut verwendet und übergeordnete Instanzmitglieder werden zu Child-Instanz-Mitgliedern (zum Beispiel: this.name). Child.prototype=Object.create(Parent.prototype);Child.prototype.constructor=Child;
Dies stellt sicher, dass geteilte Elternelemente in Child-Instanzen verfügbar sind (wie die Funktion getName). Diese Punkte werden hier genauer erklärt: Ссылка
Was Ihre drei Punkte betrifft:
jQuery.extend
), aber soweit Referenztypen verwendet werden, sind Prototypen die einzige Möglichkeit, Vererbung zu erzeugen. Wenn es Ihnen wichtig ist, Konventionen zu befolgen, damit Leute (und Sie die Straße hinunter) Ihren Code wirklich verstehen, sollten Sie this.engine="v8"
nicht in den Konstruktor einfügen. Prototyp soll Eigenschaften für jedes einzelne Auto definieren, und der Konstruktor soll einzelne Instanzen definieren. Also warum würdest du etwas, das für jeden Fall im Konstruktor stimmt? Dies gehört in den Prototyp. Es gibt etwas, das gesagt werden kann, um die Dinge an ihren richtigen Platz zu bringen, selbst wenn beide Dinge dazu führen, dasselbe zu erreichen. Ihr Code wird von Ihnen und anderen verständlich sein.
In Bezug auf Ihre Punkte:
some_instance.foo
abgerufen werden. "Statische" Eigenschaften / Methoden sind unterschiedlich (siehe unten). Lassen Sie mich einige Dinge erklären, um zu sehen, ob das hilft. Das Erstellen neuer "Klassen" in Javascript ist ein ziemlich einfacher Prozess.
%Vor%Zu diesem Zeitpunkt ist sich die Engine Ihrer neuen Klasse bewusst und weiß, was zu tun ist (hinsichtlich der Leistung), wenn sie neue Instanzen Ihrer "Klasse" erstellt.
%Vor%Wenn Sie den Prototyp ändern möchten, können Sie dies tun und wissen, dass jede Instanz aktualisiert wird, da sie alle denselben Prototyp haben.
%Vor%Jetzt weiß die Engine, dass es eine "name" -Eigenschaft gibt, die einen String-Wert erwartet ... sie wird diese Ressourcen allen neuen UND existierenden Instanzen Ihrer Klasse zuweisen ... was sehr ist praktisch. Beachten Sie, dass das Ändern des Prototyps einer vorhandenen "Klasse" wie dieser ein teurer Prozess ist und nicht häufig ausgeführt werden sollte (aber haben Sie auch keine Angst davor).
Ich kann nicht wirklich für die Leistung Vor- und Nachteile sprechen, Ad-hoc-Eigenschaften / Methoden für eine Instanz zu deklarieren:
%Vor%Meine Vermutung ist, dass dies für die Engine ziemlich einfach ist und keine große Sache ist, es sei denn, Sie tun dies für Zehntausende von Objekten gleichzeitig.
Der Hauptvorteil der Verwendung des Prototyps IMO besteht darin, dass Sie Code schreiben können, um die Funktionalität einer Methode zu erweitern und zu wissen, dass alle Instanzen Ihrer "Klasse" entsprechend aktualisiert werden:
%Vor%Bei "statischen" Eigenschaften deklarieren Sie diese für die "Klasse" (Konstruktor) selbst:
%Vor%Jetzt können Sie init / destroy-Methoden wie folgt erstellen:
%Vor%Ich hoffe, das hilft.
(1) Ich denke nicht, dass die Einsparung von Speicher alleine ein guter Grund ist, um .prototype zu verwenden, es sei denn, Sie werden mit der Duplizierung von Objekten wirklich extrem.
(2) Die Idee der statischen Eigenschaften ist nicht wirklich ein Grund, um .prototype (IMHO) zu verwenden, weil es sich nicht wie eine traditionelle statische Eigenschaft verhält. Sie (soweit ich weiß) benötigen immer eine Objektinstanz, bevor Sie auf die Eigenschaft "static" zugreifen können, was sie überhaupt nicht statisch macht.
%Vor%Es sollte beachtet werden, dass diese "statische" Idee nicht nur für Eigenschaften gilt, sondern für alle Mitglieder, die Methoden (Funktionen) aus einer traditionellen OO-Perspektive enthält.
Es ist besser, über Prototypen (wieder IMHO) als injizierte Singleton-Objekte mit Verhaltensweisen nachzudenken, die an Instanzobjekte angehängt werden. Alle Instanzen von Car () können ihre eigenen Instanzmitglieder haben, aber jede Instanz von Car () wird auch automatisch mit allen Mitgliedern / Verhaltensweisen von Car.prototype "injiziert". Es ist technisch nicht das Gleiche, aber ich finde es praktisch, auf diese Weise über Prototypen nachzudenken.
%Vor%Car.prototype verhält sich wie ein Singleton-Objekt, dessen Mitglieder / Verhaltensweisen in Instanzobjekte vom Typ Auto injiziert wurden.
(3) Prototypen sollten nicht wegen Vererbung verwechselt werden. Sie können Verhalten erhalten, das als Vererbung erscheint, aber nicht. Die Member / Verhaltensweisen auf dem Prototyp verbleiben auf dem Prototypobjekt. Sie werden nicht Mitglieder / Verhaltensweisen Ihrer abgeleiteten Klasse, wie wahre Vererbung. Deshalb beschreibe ich es eher so, als würde der Prototyp in deine Instanz "injiziert" werden.
%Vor%Also, um die Frage direkt zu beantworten: Gibt es einen Nutzen für die Verwendung von Prototypen, anstatt Eigenschaften für das Objekt selbst zu deklarieren?
Ja, wenn Sie die Verhaltensimplementierung unter Instanzobjekten eines bestimmten Typs teilen möchten. Als Zufall reduzieren Sie Ihren Speicherbedarf, aber das ist kein Grund, Prototypen zu verwenden. Weder "statische Eigenschaften erstellen" (was sie nicht sind), noch Vererbung (was nicht ist).
Tags und Links javascript ecma262