Was ist der Unterschied zwischen
var A = function () {
this.x = function () {
//do something
};
};
und
var A = function () { };
A.prototype.x = function () {
//do something
};
javascript
prototype
this
sw234
quelle
quelle
a1.x !== a2.x
; auf Prototyp:a1.x === a2.x
Antworten:
Die Beispiele haben sehr unterschiedliche Ergebnisse.
Bevor Sie sich die Unterschiede ansehen, sollten Sie Folgendes beachten:
[[Prototype]]
Eigenschaft der Instanz zwischen Instanzen auszutauschen.myObj.method()
) , verweist diese innerhalb der Methode auf das Objekt. Wenn dies nicht durch den Aufruf oder die Verwendung von bind festgelegt wird , wird standardmäßig das globale Objekt (Fenster in einem Browser) verwendet oder bleibt im strengen Modus undefiniert.Hier sind also die fraglichen Schnipsel:
In diesem Fall wird der Variablen
A
ein Wert zugewiesen, der auf eine Funktion verweist. Wenn diese Funktion mit aufgerufen wirdA()
, wird dies nicht durch den Aufruf festgelegt, sodass standardmäßig das globale Objekt verwendet wird und der Ausdruckthis.x
wirksam istwindow.x
. Das Ergebnis ist, dass ein Verweis auf den Funktionsausdruck auf der rechten Seite zugewiesen wirdwindow.x
.Im Falle des:
etwas ganz anderes passiert. In der ersten Zeile wird der Variablen
A
eine Referenz auf eine Funktion zugewiesen. In JavaScript verfügen alle Funktionsobjekte standardmäßig über eine Prototyp- Eigenschaft, sodass kein separater Code zum Erstellen eines A.prototype- Objekts vorhanden ist.In der zweiten Zeile wird A.prototype.x eine Referenz auf eine Funktion zugewiesen. Dadurch wird eine x- Eigenschaft erstellt, wenn sie nicht vorhanden ist, oder ein neuer Wert zugewiesen, wenn dies der Fall ist. Der Unterschied zum ersten Beispiel, in dem die x- Eigenschaft des Objekts am Ausdruck beteiligt ist.
Ein weiteres Beispiel ist unten. Es ist ähnlich wie beim ersten (und vielleicht, worüber Sie fragen wollten):
In diesem Beispiel wurde der
new
Operator vor dem Funktionsausdruck hinzugefügt, damit die Funktion als Konstruktor aufgerufen wird. Beim Aufruf mitnew
wird die Funktion this so eingestellt, dass sie auf ein neues Objekt verweist, dessen private[[Prototype]]
Eigenschaft so eingestellt ist, dass sie auf den öffentlichen Prototyp des Konstruktors verweist . In der Zuweisungsanweisung wird diex
Eigenschaft für dieses neue Objekt erstellt. Beim Aufruf als Konstruktor gibt eine Funktion ihre zurück dieses Objekt standardmäßig zurück, sodass keine separatereturn this;
Anweisung erforderlich ist .So überprüfen Sie, ob A eine x- Eigenschaft hat:
Dies ist eine ungewöhnliche Verwendung von new, da der Konstruktor nur über A.constructor referenziert werden kann . Es wäre viel üblicher zu tun:
Eine andere Möglichkeit, ein ähnliches Ergebnis zu erzielen, besteht darin, einen sofort aufgerufenen Funktionsausdruck zu verwenden:
In diesem Fall wird
A
der Rückgabewert des Aufrufs der Funktion auf der rechten Seite zugewiesen. Da dies im Aufruf nicht festgelegt ist, verweist es auch hier auf das globale Objekt undthis.x
ist wirksamwindow.x
. Da die Funktion nichts zurückgibt,A
hat sie einen Wert vonundefined
.Diese Unterschiede zwischen den beiden Ansätzen zeigen sich auch, wenn Sie Ihre Javascript-Objekte zu / von JSON serialisieren und de-serialisieren. Auf dem Prototyp eines Objekts definierte Methoden werden beim Serialisieren des Objekts nicht serialisiert. Dies kann praktisch sein, wenn Sie beispielsweise nur die Datenteile eines Objekts serialisieren möchten, nicht jedoch die Methoden:
Verwandte Fragen :
Nebenbemerkung: Es gibt möglicherweise keine signifikanten Speichereinsparungen zwischen den beiden Ansätzen. Die Verwendung des Prototyps zum Teilen von Methoden und Eigenschaften benötigt jedoch wahrscheinlich weniger Speicher als jede Instanz mit einer eigenen Kopie.
JavaScript ist keine einfache Sprache. Es ist möglicherweise nicht sehr wertvoll, sich Prototyping oder andere Vererbungsmuster vorzustellen, um die Art und Weise, wie Speicher zugewiesen wird, explizit zu ändern.
quelle
null
), das sich jedoch stark von derprototype
Eigenschaft unterscheidet, die sich auf Funktionen bezieht und auf die der Prototyp aller Instanzen festgelegt wird, wenn sie mit erstellt werdennew
. Ich kann nicht glauben, dass dies wirklich 87 positive Stimmen bekommen hat :-("The language is functional"
Sind Sie sicher, dass dies funktional bedeutet?A
als Funktion verwendet würden, und die andere Hälfte handelt von obskuren und unorthodoxen Methoden etwas unkompliziertes.Wie andere in der ersten Version gesagt haben, führt die Verwendung von "this" dazu, dass jede Instanz der Klasse A eine eigene unabhängige Kopie der Funktionsmethode "x" hat. Während die Verwendung von "Prototyp" bedeutet, dass jede Instanz der Klasse A dieselbe Kopie der Methode "x" verwendet.
Hier ist ein Code, der diesen subtilen Unterschied zeigt:
Wie andere bereits erwähnt haben, gibt es verschiedene Gründe, sich für die eine oder andere Methode zu entscheiden. Meine Stichprobe soll nur den Unterschied deutlich machen.
quelle
this
Objekt besteht, das der Eigentümer der Methode ist. dh die Methode hat kein Objekt, das ihr Besitzer ist. In diesem Fall gibt es einthis
Objekt, wie im Beispiel in Klasse A gezeigt.Nehmen Sie diese 2 Beispiele:
vs.
Die meisten Leute hier (insbesondere die am besten bewerteten Antworten) versuchten zu erklären, wie sie sich unterscheiden, ohne zu erklären, WARUM. Ich denke, das ist falsch und wenn Sie zuerst die Grundlagen verstehen, wird der Unterschied offensichtlich. Versuchen wir zunächst, die Grundlagen zu erklären ...
a) Eine Funktion ist ein Objekt in JavaScript. JEDES Objekt in JavaScript erhält eine interne Eigenschaft (dh Sie können nicht wie andere Eigenschaften darauf zugreifen, außer vielleicht in Browsern wie Chrome), die häufig als bezeichnet wird
__proto__
(Sie können tatsächlichanyObject.__proto__
Chrome eingeben, um zu sehen, worauf es verweist. Dies ist genau das , eine Eigenschaft, nichts weiter. Eine Eigenschaft in JavaScript = eine Variable innerhalb eines Objekts, nichts weiter. Was machen Variablen? Sie zeigen auf Dinge.Worauf weist diese
__proto__
Eigenschaft hin? Nun, normalerweise ein anderes Objekt (wir werden später erklären, warum). Die einzige Möglichkeit, JavaScript zu erzwingen, damit die__proto__
Eigenschaft NICHT auf ein anderes Objekt verweist, ist die Verwendungvar newObj = Object.create(null)
. Selbst wenn Sie dies tun, existiert die__proto__
Eigenschaft STILL als Eigenschaft des Objekts, nur zeigt sie nicht auf ein anderes Objekt, sondern aufnull
.Hier sind die meisten Leute verwirrt:
Wenn Sie eine neue Funktion in JavaScript erstellen (was auch ein Objekt ist, erinnern Sie sich?), Erstellt JavaScript in dem Moment, in dem es definiert wird, automatisch eine neue Eigenschaft für diese Funktion namens
prototype
. Versuch es:A.prototype
ist völlig anders als die__proto__
Eigenschaft. In unserem Beispiel hat 'A' jetzt ZWEI Eigenschaften, die als 'Prototyp' und 'bezeichnet werden__proto__
. Dies ist eine große Verwirrung für die Menschen.prototype
und__proto__
Eigenschaften sind in keiner Weise miteinander verbunden, sie sind separate Dinge, die auf separate Werte verweisen.Sie fragen sich vielleicht: Warum hat JavaScript
__proto__
für jedes einzelne Objekt eine Eigenschaft erstellt? Nun, ein Wort: Delegation . Wenn Sie eine Eigenschaft für ein Objekt aufrufen und das Objekt sie nicht hat, sucht JavaScript nach dem Objekt, auf das verwiesen wird,__proto__
um festzustellen, ob es möglicherweise vorhanden ist. Wenn es nicht vorhanden ist, wird die__proto__
Eigenschaft dieses Objekts usw. überprüft, bis die Kette endet. So der Name Prototypkette . Wenn JavaScript__proto__
nicht auf ein Objekt zeigt und stattdessen auf einnull
Pech zeigt, erkennt JavaScript dies und gibt Sieundefined
für die Eigenschaft zurück.Sie fragen sich vielleicht auch, warum JavaScript eine Eigenschaft erstellt, die
prototype
für eine Funktion aufgerufen wird, wenn Sie die Funktion definieren. Weil es versucht, Sie zu täuschen, täuschen Sie, dass es wie klassenbasierte Sprachen funktioniert.Fahren wir mit unserem Beispiel fort und erstellen ein "Objekt" aus
A
:Es passiert etwas im Hintergrund, als dieses Ding passiert ist.
a1
ist eine gewöhnliche Variable, der ein neues, leeres Objekt zugewiesen wurde.Die Tatsache, dass Sie den Operator
new
vor einem Funktionsaufruf verwendetA()
haben, hat im Hintergrund etwas ZUSÄTZLICHES bewirkt. Dasnew
Schlüsselwort hat ein neues Objekt erstellt, auf das jetzt verwiesen wird,a1
und dieses Objekt ist leer. Folgendes passiert zusätzlich:Wir haben gesagt, dass für jede Funktionsdefinition eine neue Eigenschaft namens erstellt wird
prototype
(auf die Sie im Gegensatz zur__proto__
Eigenschaft zugreifen können ). Nun, diese Eigenschaft wird jetzt verwendet.Wir sind jetzt an dem Punkt angelangt, an dem wir ein frisch gebackenes leeres
a1
Objekt haben. Wir haben gesagt, dass alle Objekte in JavaScript eine interne__proto__
Eigenschaft haben, die auf etwas verweist (a1
auch darauf), ob es null oder ein anderes Objekt ist. Dernew
Operator setzt diese__proto__
Eigenschaft so, dass sie auf die Eigenschaft der Funktion verweistprototype
. Lesen Sie das noch einmal. Es ist im Grunde das:Wir sagten, das
A.prototype
sei nichts weiter als ein leeres Objekt (es sei denn, wir ändern es vor der Definition in etwas anderesa1
). Zeigt nun also im Grundea1.__proto__
auf dasselbeA.prototype
, worauf das leere Objekt verweist. Beide zeigen auf dasselbe Objekt, das beim Auftreten dieser Zeile erstellt wurde:Jetzt passiert noch etwas, wenn die
var a1 = new A()
Anweisung verarbeitet wird. GrundsätzlichA()
wird ausgeführt und wenn A so etwas ist:All das Zeug im Inneren
function() { }
wird ausgeführt. Wenn Sie diethis.hey..
Linie erreichen,this
wird in geänderta1
und Sie erhalten Folgendes:Ich werde nicht erläutern, warum
this
Änderungen an vorgenommen wurden,a1
aber dies ist eine großartige Antwort , um mehr zu erfahren.Zusammenfassend lässt sich sagen,
var a1 = new A()
dass im Hintergrund drei Dinge passieren:a1
.a1 = {}
a1.__proto__
Die Eigenschaft wird so zugewiesen, dass sie auf dasselbe zeigt wieA.prototype
auf (ein anderes leeres Objekt {}).Die Funktion
A()
wird ausgeführt, indemthis
auf das neue, leere Objekt gesetzt wird, das in Schritt 1 erstellt wurde (lesen Sie die Antwort, auf die ich oben verwiesen habe, warumthis
Änderungen an vorgenommen wurdena1
).Versuchen wir nun, ein anderes Objekt zu erstellen:
Die Schritte 1, 2, 3 werden wiederholt. Merkst du etwas Das Schlüsselwort ist wiederholen. Schritt 1:
a2
wird ein neues leeres Objekt sein, Schritt 2: seine__proto__
Eigenschaft zeigt auf dasselbe, wasA.prototype
auf und vor allem zeigt, Schritt 3: FunktionA()
wird WIEDER ausgeführt, was bedeutet, dassa2
einehey
Eigenschaft erhalten wird, die eine Funktion enthält.a1
unda2
haben zwei SEPARATE Eigenschaften benannt,hey
die auf 2 SEPARATE Funktionen verweisen! Wir haben jetzt doppelte Funktionen in denselben zwei verschiedenen Objekten, die dasselbe tun, oops ... Sie können sich die Auswirkungen auf den Speicher vorstellen, wenn 1000 Objekte mit erstellt werdennew A
, nachdem alle Funktionsdeklarationen mehr Speicher benötigen als so etwas wie die Nummer 2. Also Wie verhindern wir das?Erinnern Sie sich, warum die
__proto__
Eigenschaft auf jedem Objekt existiert? Wenn Sie also dieyoMan
Eigenschaft abrufena1
(die nicht vorhanden ist), wird ihre__proto__
Eigenschaft konsultiert. Wenn es sich um ein Objekt handelt (und dies in den meisten Fällen auch ist), wird überprüft, ob es enthältyoMan
und ob dies nicht der Fall ist. Es wird das Objekt__proto__
usw. konsultieren . Wenn dies der Fall ist, wird dieser Eigenschaftswert verwendet und angezeigt.Also hat sich jemand entschieden, diese Tatsache + die Tatsache zu verwenden, dass beim Erstellen
a1
die__proto__
Eigenschaft auf dasselbe (leere) ObjektA.prototype
verweist und auf Folgendes verweist:Cool! Wenn Sie jetzt erstellen
a1
, werden alle drei oben genannten Schritte erneut durchlaufen, und in Schritt 3 wird nichts ausgeführt, dafunction A()
nichts ausgeführt werden muss. Und wenn wir das tun:Es wird sehen, dass
a1
es nicht enthält,hey
und es wird sein__proto__
Eigenschaftsobjekt überprüfen, um festzustellen, ob es es hat, was der Fall ist.Mit diesem Ansatz entfernen wir den Teil aus Schritt 3, in dem Funktionen bei jeder neuen Objekterstellung dupliziert werden. Anstelle von
a1
unda2
mit einer separatenhey
Eigenschaft hat jetzt KEINE von ihnen diese. Was Sie wohl inzwischen selbst herausgefunden haben. Das ist das Schöne ... wenn Sie verstehen__proto__
undFunction.prototype
, werden Fragen wie diese ziemlich offensichtlich sein.HINWEIS: Einige Leute neigen dazu, die interne Prototype-Eigenschaft nicht als zu bezeichnen
__proto__
. Ich habe diesen Namen durch den Beitrag verwendet, um ihn klar von derFunctional.prototype
Eigenschaft als zwei verschiedene Dinge zu unterscheiden.quelle
__proto__
und.prototype
sind ganz andere Dinge.In den meisten Fällen sind sie im Wesentlichen gleich, aber die zweite Version spart Speicher, da für jedes Objekt nur eine Instanz der Funktion anstelle einer separaten Funktion vorhanden ist.
Ein Grund für die Verwendung des ersten Formulars ist der Zugriff auf "private Mitglieder". Zum Beispiel:
Aufgrund der Gültigkeitsregeln von Javascript steht private_var für die dieser.x zugewiesene Funktion zur Verfügung, jedoch nicht außerhalb des Objekts.
quelle
Im ersten Beispiel wird die Schnittstelle nur für dieses Objekt geändert. Das zweite Beispiel ändert die Schnittstelle für alle Objekte dieser Klasse.
quelle
x
für alle Objekte verfügbar machen, deren Prototyp eine neue Instanz von A:function B () {}; B.prototype = new A(); var b = new B(); b.x() // Will call A.x if A is defined by first example;
Das ultimative Problem bei der Verwendung
this
anstelle vonprototype
besteht darin, dass der Konstruktor der Basisklasse beim Überschreiben einer Methode weiterhin auf die überschriebene Methode verweist. Bedenken Sie:gegen:
Wenn Sie der Meinung sind, dass dies kein Problem ist, hängt es davon ab, ob Sie ohne private Variablen leben können und ob Sie genug Erfahrung haben, um ein Leck zu erkennen, wenn Sie eines sehen. Es ist auch unpraktisch, die Konstruktorlogik nach den Methodendefinitionen zu setzen.
gegen:
quelle
Jedes Objekt ist mit einem Prototypobjekt verknüpft. Beim Versuch, auf eine nicht vorhandene Eigenschaft zuzugreifen, sucht JavaScript im Prototypobjekt des Objekts nach dieser Eigenschaft und gibt sie zurück, falls vorhanden.
Die
prototype
Eigenschaft eines Funktionskonstruktors bezieht sich auf das Prototypobjekt aller Instanzen, die bei Verwendung mit dieser Funktion erstellt wurdennew
.In Ihrem ersten Beispiel fügen Sie
x
jeder mit derA
Funktion erstellten Instanz eine Eigenschaft hinzu .Im zweiten Beispiel fügen Sie dem Prototypobjekt eine Eigenschaft hinzu, auf die alle mit erstellten Instanzen
A
verweisen.Abschließend wird im ersten Beispiel jeder Instanz eine Kopie der Funktion zugewiesen . Im zweiten Beispiel wird eine einzelne Kopie der Funktion von allen Instanzen gemeinsam genutzt .
quelle
Was ist der Unterschied? => Viel.
Ich denke, die
this
Version wird verwendet, um die Kapselung zu ermöglichen, dh Daten zu verstecken. Es hilft, private Variablen zu manipulieren.Schauen wir uns das folgende Beispiel an:
Jetzt kann die
prototype
Struktur wie folgt angewendet werden:Unterschiedliche Erwachsene haben unterschiedliche Altersstufen, aber alle Erwachsenen erhalten die gleichen Rechte.
Also fügen wir es eher mit einem Prototyp als mit diesem hinzu.
Schauen wir uns jetzt die Implementierung an.
Hoffe das hilft.
quelle
Der Prototyp ist die Vorlage der Klasse. das gilt für alle zukünftigen Instanzen davon. Dies ist die besondere Instanz des Objekts.
quelle
Ich weiß, dass dies zu Tode beantwortet wurde, aber ich möchte ein aktuelles Beispiel für Geschwindigkeitsunterschiede zeigen.
Hier erstellen wir 2.000.000 neue Objekte mit einer
print
Methode in Chrome. Wir speichern jedes Objekt in einem Array. Das Anbringenprint
des Prototyps dauert etwa halb so lange.quelle
Lassen Sie mich eine umfassendere Antwort geben, die ich während eines JavaScript-Schulungskurses gelernt habe.
Die meisten Antworten erwähnten den Unterschied bereits, dh wenn das Prototyping der Funktion mit allen (zukünftigen) Instanzen geteilt wird. Durch das Deklarieren der Funktion in der Klasse wird für jede Instanz eine Kopie erstellt.
Im Allgemeinen gibt es kein Richtig oder Falsch, es ist eher eine Frage des Geschmacks oder einer Designentscheidung, abhängig von Ihren Anforderungen. Der Prototyp ist jedoch die Technik, mit der sich objektorientiert entwickelt, wie Sie hoffentlich am Ende dieser Antwort sehen werden.
Sie haben in Ihrer Frage zwei Muster gezeigt. Ich werde versuchen, zwei weitere zu erklären und gegebenenfalls die Unterschiede zu erklären. Fühlen Sie sich frei zu bearbeiten / erweitern. In allen Beispielen handelt es sich um ein Autoobjekt, das einen Standort hat und sich bewegen kann.
Objektdekoratormuster
Ich bin mir nicht sicher, ob dieses Muster heutzutage noch relevant ist, aber es existiert. Und es ist gut darüber zu wissen. Sie übergeben einfach ein Objekt und eine Eigenschaft an die Dekorationsfunktion. Der Dekorateur gibt das Objekt mit Eigenschaft und Methode zurück.
Funktionsklassen
Eine Funktion in JavaScript ist ein spezialisiertes Objekt. Eine Funktion wird nicht nur aufgerufen, sondern kann auch Eigenschaften wie jedes andere Objekt speichern.
In diesem Fall
Car
handelt es sich um eine Funktion ( auch Think Object ), die wie gewohnt aufgerufen werden kann. Es hat eine Eigenschaftmethods
(die ein Objekt mit einermove
Funktion ist). WennCar
es aufgerufen wird, wird dieextend
Funktion aufgerufen, die etwas Magie ausübt und dieCar
Funktion (Denkobjekt) um die darin definierten Methoden erweitertmethods
.Dieses Beispiel ist zwar anders, kommt aber dem ersten Beispiel in der Frage am nächsten.
Prototypische Klassen
Die ersten beiden Muster ermöglichen eine Diskussion der Verwendung von Techniken zum Definieren gemeinsam genutzter Methoden oder von Methoden, die inline im Hauptteil des Konstruktors definiert sind. In beiden Fällen hat jede Instanz ihre eigene
move
Funktion.Das prototypische Muster eignet sich nicht gut für dieselbe Untersuchung, da die gemeinsame Nutzung von Funktionen über eine Prototypdelegation das eigentliche Ziel des prototypischen Musters ist. Wie andere betonten, wird ein besserer Speicherbedarf erwartet.
Es gibt jedoch einen interessanten Punkt zu wissen: Jedes
prototype
Objekt verfügt über eine Convenience-Eigenschaftconstructor
, die auf die Funktion (Denkobjekt) verweist, an die es angehängt wurde.Zu den letzten drei Zeilen:
In diesem Beispiel wird
Car
auf dasprototype
Objekt verwiesen, das überconstructor
sichCar
selbst verlinkt , dh aufCar.prototype.constructor
sichCar
selbst. Auf diese Weise können Sie herausfinden, welche Konstruktorfunktion ein bestimmtes Objekt erstellt hat.amy.constructor
Die Suche schlägt fehl und wird daher an delegiertCar.prototype
, die über die Konstruktoreigenschaft verfügt. Und soamy.constructor
ist es auchCar
.Darüber hinaus
amy
ist eininstanceof
Car
. Derinstanceof
Operator prüft, ob sich das Prototypobjekt (Car
) des rechten Operanden an einer beliebigen Stelle in der Prototypenkette (amy
) des linken Operanden befindet .Einige Entwickler können am Anfang verwirrt sein. Siehe Beispiel unten:
Der
instanceof
Bediener kehrt zurückfalse
, daDog
der Prototyp nirgendwo infido
der Prototypenkette gefunden werden kann.fido
ist ein einfaches Objekt, das mit einem Objektliteral erstellt wird, dh nur an delegiertObject.prototype
.Pseudoklassische Muster
Dies ist wirklich nur eine andere Form des prototypischen Musters in vereinfachter Form und vertrauter für diejenigen, die beispielsweise in Java programmieren, da es den
new
Konstruktor verwendet.Es macht das gleiche wie im prototypischen Muster, es ist nur syntaktischer Zucker über dem prototypischen Muster.
Der Hauptunterschied besteht jedoch darin, dass in JavaScript-Engines Optimierungen implementiert sind, die nur bei Verwendung des pseudoklassischen Musters gelten. Stellen Sie sich das pseudoklassische Muster als wahrscheinlich schnellere Version des prototypischen Musters vor. Die Objektbeziehungen in beiden Beispielen sind gleich.
Schließlich sollte es nicht allzu schwierig sein zu erkennen, wie objektorientierte Programmierung durchgeführt werden kann. Es gibt zwei Abschnitte.
Ein Abschnitt, der allgemeine Eigenschaften / Methoden im Prototyp (Kette) definiert.
Und ein weiterer Abschnitt, in dem Sie die Definitionen einfügen, die die Objekte voneinander unterscheiden (
loc
Variable in den Beispielen).Dies ermöglicht es uns, Konzepte wie Superklasse oder Unterklasse in JavaScript anzuwenden.
Fühlen Sie sich frei, hinzuzufügen oder zu bearbeiten. Noch einmal vollständig könnte ich dies vielleicht zu einem Community-Wiki machen.
quelle
Ich glaube, dass @Matthew Crumley Recht hat. Sie sind funktional , wenn nicht strukturell äquivalent. Wenn Sie Firebug verwenden, um die Objekte zu betrachten, die mit erstellt wurden
new
, können Sie feststellen, dass sie identisch sind. Meine Präferenz wäre jedoch die folgende. Ich vermute, dass es eher so aussieht, wie ich es in C # / Java gewohnt bin. Definieren Sie also die Klasse, definieren Sie die Felder, den Konstruktor und die Methoden.BEARBEITEN Wollte nicht bedeuten, dass der Bereich der Variablen privat war, ich wollte nur veranschaulichen, wie ich meine Klassen in Javascript definiere. Der Variablenname wurde geändert, um dies widerzuspiegeln.
quelle
initialize
undx methods do not refer to the
_instance_var` für eineA
Instanz, jedoch für eine globale. Verwendenthis._instance_var
Sie diese Option, wenn Sie die_instance_var
Eigenschaft einerA
Instanz verwenden möchten.Wie in anderen Antworten erläutert, handelt es sich tatsächlich um eine Leistungsüberlegung, da die Funktion im Prototyp mit allen Instanziierungen geteilt wird - und nicht mit der Funktion, die für jede Instanziierung erstellt wird.
Ich habe ein jsperf zusammengestellt, um dies zu zeigen. Es gibt einen dramatischen Unterschied in der Zeit, die zum Instanziieren der Klasse benötigt wird, obwohl dies wirklich nur relevant ist, wenn Sie viele Instanzen erstellen.
http://jsperf.com/functions-in-constructor-vs-prototype
quelle
Denken Sie an statisch typisierte Sprache, Dinge an
prototype
sind statisch und Dinge anthis
sind instanzbezogen.quelle