Hat die Verwendung des Prototyps Vorteile, anstatt Eigenschaften für das Objekt selbst zu deklarieren?

9

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:

  1. Speicher sparen
  2. bietet statische Eigenschaften
  3. ist die einzige Möglichkeit, dass ein Referenztyp von einer Superklasse
  4. erbt
user1472219 02.07.2012, 13:24
quelle

6 Antworten

2
  

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.

  1. Im Child-Body Parent.apply(this,arguments); wird der Parent-Initialisierungscode erneut verwendet und übergeordnete Instanzmitglieder werden zu Child-Instanz-Mitgliedern (zum Beispiel: this.name).
  2. Setzen von Child.prototype auf seichte Kopie von Parent.prototype 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: Ссылка

    
HMR 24.01.2014 02:38
quelle
1

Was Ihre drei Punkte betrifft:

  1. Prototypen sind nicht unbedingt performanter, insbesondere für lange Kettenglieder oder viele Mitglieder. Je kleiner der Prototyp und je kürzer die Kette, desto mehr kann der Compiler des Browsers optimieren. Letztendlich muss diese Frage nach individuellen Anwendungen, ihren individuellen Bedürfnissen und den Browsern gefragt werden (die in der Leistung stark variieren können).
  2. Statische Elemente benötigen definitionsgemäß Objekte. Das heißt, statische Elemente gehören zu einem Objekt selbst und nicht zu einer bestimmten Instanz. Objekte sind die einzige Möglichkeit, statische Eigenschaften in JavaScript zu erstellen. Beachten Sie, dass Objektliterale, die eine "spezielle" Art von Objekt sind, im Wesentlichen statisch sind.
  3. Man könnte seinen eigenen Objekttyp implementieren, der etwas wie Vererbung zulässt (d. h. jQuery.extend ), aber soweit Referenztypen verwendet werden, sind Prototypen die einzige Möglichkeit, Vererbung zu erzeugen.
Donald Taylor 24.01.2014 01:54
quelle
0

Prototyping ist viel mehr als das. Sie können auch Klassen und bereits vorhandene Instanzen von Objekten zur Laufzeit mit Methoden und Eigenschaften erweitern.

Dies sollte es auf eine sehr verständliche Weise erklären: Ссылка

    
drw85 22.01.2014 13:24
quelle
0

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.

    
Nick Manning 24.01.2014 01:26
quelle
0

In Bezug auf Ihre Punkte:

  1. Es gibt definitiv einen Leistungsschub, besonders in Bezug auf Funktionen - es ist viel besser, Funktionen auf dem Prototyp zu deklarieren.
  2. Ich denke, Sie wollten "öffentliche" Eigenschaften sagen, damit Informationen durch Schreiben von some_instance.foo abgerufen werden. "Statische" Eigenschaften / Methoden sind unterschiedlich (siehe unten).
  3. Richtig. Vererbung kann nur wirklich vom Prototyp geschehen.

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.

    
Ryan Wheale 28.01.2014 10:39
quelle
0

(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).

    
tyriker 29.01.2014 18:24
quelle

Tags und Links