Diese Abbildung zeigt erneut, dass jedes Objekt einen Prototyp hat. Die Konstruktorfunktion Foo hat auch eine eigene
__proto__
Funktion, nämlich Function.prototype, und die wiederum über ihre__proto__
Eigenschaft erneut auf den Object.prototype verweist. Wiederholen Sie also, Foo.prototype ist nur eine explizite Eigenschaft von Foo, die sich auf den Prototyp von b- und c-Objekten bezieht.
var b = new Foo(20);
var c = new Foo(30);
Was sind die Unterschiede zwischen __proto__
und prototype
?
Die Figur stammt von dmitrysoshnikov.com .
__proto__
sich vonconstructor.prototype
?Antworten:
__proto__
ist das eigentliche Objekt, das in der Suchkette zum Auflösen von Methoden usw. verwendetprototype
wird. Ist das Objekt, das zum Erstellen verwendet wird,__proto__
wenn Sie ein Objekt erstellen mitnew
:quelle
prototype
also nicht für die Instanzen selbst (oder andere Objekte) verfügbar, sondern nur für die Konstruktorfunktionen.prototype
ist nur für Funktionen verfügbar, da sie vonFunction
, abgeleitet sindFunction
,Object
in anderen Fällen jedoch nicht. Ist__proto__
jedoch überall verfügbar.__proto__
ist das eigentliche Objekt, das gespeichert und als Prototyp verwendet wird, währendMyconstructure.prototype
es nur eine Blaupause ist, für__proto__
die das tatsächlich gespeicherte und als Prototyp verwendete Objekt infakt ist. Dahermyobject.prototype
wäre es keine Eigenschaft des tatsächlichen Objekts, da es nur eine temporäre Sache ist, die von der Konstruktorfunktion verwendet wird, um zu skizzieren, wiemyobject.__proto__
sie aussehen soll.__proto__
Eigenschaft eines Objekts ein Zeiger auf dieprototype
Eigenschaft der Konstruktorfunktion des Objekts ist ? dh foo .__ proto__ === foo.constructor.prototypenewCar.__proto__
ISCar.prototype
, keine Instanz vonCar.prototype
. WährendCar.protoype
IS eine Instanz einesobject
.Car.prototype
ist nicht etwas , das gibtnewCar
keine Eigenschaften oder die Struktur, es ist einfach IST die nächsteobject
innewCar
‚s - Prototyp - Kette.Car.prototype
ist keine vorübergehendeobject
. Es ist dasobject
, was als Wert der__proto__
Eigenschaft aller neuenobject
s festgelegt wird, die mitCar
als erstellt wurdenconstructor
. Wenn Sie irgendetwas als Vorlage denkenobject
, denken Sie anCar
als Vorlage für neue Auto-object
s.prototype
ist eine Eigenschaft eines Funktionsobjekts. Es ist der Prototyp von Objekten, die von dieser Funktion erstellt wurden.__proto__
ist die interne Eigenschaft eines Objekts und zeigt auf seinen Prototyp. Aktuelle Standards bieten eine äquivalenteObject.getPrototypeOf(O)
Methode, obwohl der De-facto-Standard__proto__
schneller ist.Sie können
instanceof
Beziehungen finden, indem Sie die Funktionen einer Funktionprototype
mit der__proto__
Kette eines Objekts vergleichen , und Sie können diese Beziehungen durch Ändern aufhebenprototype
.Hier
Point
ist eine Konstruktorfunktion, die prozedural ein Objekt (Datenstruktur) erstellt.myPoint
ist ein Objekt, das vonPoint()
so erstellt wurdePoint.prototype
,myPoint.__proto__
dass es zu diesem Zeitpunkt gespeichert wird.quelle
__proto__
Eigenschaft eines Objekts ändern , ändert sich auch das Objekt, für das Prototypsuchen durchgeführt werden. Sie können beispielsweise ein Methodenobjekt als Funktion hinzufügen__proto__
, um eine Art aufrufbares Instanzobjekt zu erhalten.console.log(obj1.call) // [Function: call]
obj1.call()
// TypeError: obj1.call ist keine Funktion. Ich habeobj.__proto__ = Function.__proto__
myFn.__proto__ = {foo: 'bar'}
Die Prototyp-Eigenschaft wird erstellt, wenn eine Funktion deklariert wird.
Zum Beispiel:
Person.prototype
Die Eigenschaft wird intern erstellt, sobald Sie die obige Funktion deklariert haben. Dem Person.prototype können viele Eigenschaften hinzugefügt werden, die von Personeninstanzen gemeinsam genutzt werden, die mit new Person () erstellt wurden.Es ist erwähnenswert, dass dies standardmäßig
Person.prototype
einObject
Literal ist (es kann nach Bedarf geändert werden).Jede mit erstellte Instanz
new Person()
verfügt über eine__proto__
Eigenschaft, die auf die verweistPerson.prototype
. Dies ist die Kette, die zum Durchlaufen verwendet wird, um eine Eigenschaft eines bestimmten Objekts zu finden.Erstellt 2 Instanzen von
Person
, können diese 2 Objekte dieage
MethodePerson.prototype
asperson1.age
,person2.age
.In dem obigen Bild aus Ihrer Frage können Sie sehen, dass
Foo
es sich um ein handeltFunction Object
und daher einen__proto__
Link zu dem hat,Function.prototype
der wiederum eine Instanz von istObject
und einen__proto__
Link zu hatObject.prototype
. Der Proto-Link endet hier mit__proto__
demObject.prototype
Hinweis aufnull
.Jedes Objekt kann auf alle Eigenschaften seiner Protokette zugreifen, die durch verknüpft sind
__proto__
, und bildet so die Grundlage für die prototypische Vererbung.__proto__
ist kein Standard für den Zugriff auf die Prototypenkette, sondern der Standardansatz, der jedoch ähnlich istObject.getPrototypeOf(obj)
.Der folgende Code für den
instanceof
Bediener gibt ein besseres Verständnis:Der
instanceof
Operator object class wird zurückgegeben,true
wenn ein Objekt eine Instanz einer Klasse ist. Insbesondere wennClass.prototype
sich das Objekt in der Protokette dieses Objekts befindet, ist das Objekt eine Instanz dieser Klasse.Die obige Methode kann wie
instanceOf.call(object, Class)
folgt aufgerufen werden: Diese gibt true zurück, wenn das Objekt eine Instanz der Klasse ist.quelle
prototype
Objekt überhaupt intern erstellt wurde. Könnte man dem Funktionsobjekt selbst einfach statische Methoden zuweisen? zBfunction f(a){this.a = a}; f.increment = function(){return ++this.a}
? Warum wurde dieser Weg nicht gewählt, anstatt die Methoden zumprototype
Objekt hinzuzufügen ? Dies funktioniert, wennf.__proto__ = g
g die Basisklasse ist.prototype
Objekt für die Freigabe ausgewählt, da nur die exklusiven Eigenschaften des Funktionskonstruktors im Funktionskonstruktorobjekt gespeichert werden können.instanceof
dies dazu führen({}) instanceof Function === true
würde, dass es keine Möglichkeit gibt, zwischen Prototypen zu unterscheiden, wenn dieprototype
Eigenschaft entfernt wird.new
würden, würden die Eigenschaften und Methoden nicht kopiert , wenn Sie das Schlüsselwort zum Erstellen einer Instanz verwenden würden Über.Eine schöne Art, daran zu denken, ist ...
prototype
wird vonconstructor()
Funktionen verwendet. Es hätte eigentlich so etwas heißen sollen"prototypeToInstall"
, denn so ist es.und
__proto__
ist dieser "installierte Prototyp" auf einem Objekt (der auf dem Objekt von dieserconstructor()
Funktion erstellt / installiert wurde )quelle
constructor()
Funktionen" in "Konstruktorfunktionen", da es zu Verwechslungen mit "__proto__.constructor()
Funktionen" kommen kann. Ich halte dies für wichtig, da der Konstruktor __proto __. Nicht verwendet wird, wenn einnew
Schlüsselwort verwendet wird.Zur Erklärung erstellen wir eine Funktion
Wenn JavaScript diesen Code ausführt, fügt es eine
prototype
Eigenschaft hinzua
.prototype
Eigenschaft ist ein Objekt mit zwei Eigenschaften:constructor
__proto__
Also wenn wir es tun
a.prototype
es kehrt zurückWie Sie sehen,
constructor
ist nichts anderes als die Funktiona
selbst und__proto__
zeigt auf die StammebeneObject
von JavaScript.Lassen Sie uns sehen, was passiert, wenn wir die
a
Funktion mit demnew
Schlüsselwort verwenden.Wenn JavaScript diesen Code ausführt, werden vier Dinge ausgeführt:
__proto__
aufb
und macht es zum Punkta.prototype
sob.__proto__ === a.prototype
a.prototype.constructor
wirda
mit dem neu erstellten Objekt (das in Schritt 1 erstellt wurde) als Kontext (dies) ausgeführt (was eine Definition der Funktion ist ), daher wird diename
als 'JavaScript' übergebene Eigenschaft (die hinzugefügt wirdthis
) dem neu erstellten Objekt hinzugefügt.b
dem neu erstellten Objekt zugewiesen wird.Wenn wir nun hinzufügen
a.prototype.car = "BMW"
und tunb.car
, erscheint die Ausgabe "BMW".Dies liegt daran, dass JavaScript bei der Ausführung dieses Codes, für den es nach
car
Eigenschaften gesuchtb
hat, nicht das verwendete JavaScript gefunden hatb.__proto__
(das in Schritt 2 auf 'a.prototype' verweist) und diecar
Eigenschaft gefunden hat, also "BMW" zurückgeben.quelle
constructor
kommt nicht zurücka()
! Es kehrt zurücka
. 2. gibt__proto__
zurückObject.prototype
, nicht das Stammobjekt in Javascript.Prototyp VS. __proto__ VS. [[Prototyp]]
Beim Erstellen einer Funktion wird automatisch ein Eigenschaftsobjekt namens Prototyp erstellt (Sie haben es nicht selbst erstellt) und an das Funktionsobjekt (the
constructor
) angehängt .Hinweis : Dieses neue Prototypobjekt verweist auch auf das native JavaScript-Objekt oder hat einen intern-privaten Link zu diesem.
Beispiel:
Wenn Sie ein neues Objekt aus
Foo
demnew
Schlüsselwort erstellen, erstellen Sie im Grunde (unter anderem) ein neues Objekt, das einen internen oder privaten Link zumFoo
zuvor diskutierten Prototyp der Funktion hat :Die private Verknüpfung mit dem Objekt dieser Funktion wird als Prototyp mit doppelten Klammern oder einfach bezeichnet
[[Prototype]]
. Viele Browser bieten uns eine öffentliche Verknüpfung dazu an, die aufgerufen hat__proto__
!Genauer gesagt
__proto__
handelt es sich tatsächlich um eine Getter-Funktion , die zum nativen JavaScript-Objekt gehört. Es gibt die intern-private Prototyp-Verknüpfung derthis
Bindung zurück (gibt die[[Prototype]]
von zurückb
):Es ist erwähnenswert, dass Sie ab dem Start
ECMAScript5
auch die Methode getPrototypeOf verwenden können, um die interne private Verknüpfung abzurufen :HINWEIS: diese Antwort nicht die Absicht , den gesamten Prozess der Erstellung neue Objekte oder neue Konstrukteure zu decken, aber zu helfen besser zu verstehen , was ist
__proto__
,prototype
und[[Prototype]]
und wie es funktioniert.quelle
Um es zusätzlich zu den oben genannten tollen Antworten ein wenig klarer zu machen:
Instanzen haben __proto__ , Klassen haben Prototypen .
quelle
In JavaScript kann eine Funktion als Konstruktor verwendet werden. Das heißt, wir können mit dem neuen Schlüsselwort Objekte daraus erstellen. Zu jeder Konstruktorfunktion gehört ein eingebautes Objekt, das mit ihnen verkettet ist. Dieses eingebaute Objekt wird als Prototyp bezeichnet.
Instances of a constructor function use __proto__ to access the prototype property of its constructor function.
Zuerst haben wir einen Konstruktor erstellt :
function Foo(){}
. Foo ist nur eine weitere Funktion. Wir können jedoch mit dem neuen Schlüsselwort ein Objekt daraus erstellen. Deshalb nennen wir es die KonstruktorfunktionJede Funktion verfügt über eine eindeutige Eigenschaft, die als Prototyp-Eigenschaft bezeichnet wird. Die Konstruktorfunktion
Foo
verfügt also über eine Prototyp-Eigenschaft, die auf ihren Prototyp verweistFoo.prototype
(siehe Abbildung).Konstruktorfunktionen sind selbst eine Funktion, die eine Instanz eines Systemkonstruktors ist, der als [[Function]] - Konstruktor bezeichnet wird. Wir können also sagen, dass dies
function Foo
von einem [[Function]] - Konstruktor konstruiert wird. So__proto__
unseresFoo function
Willens Punkt zum Prototyp ihres Baumeisters, das istFunction.prototype
.Function.prototype
is selbst ist nichts anderes als ein Objekt, das aus einem anderen Systemkonstruktor namens aufgebaut ist[[Object]]
. Also,[[Object]]
ist der Konstruktor vonFunction.prototype
. Wir können also sagen, esFunction.prototype
handelt sich um eine Instanz von[[Object]]
. Also__proto__
vonFunction.prototype
Punkten zuObject.prototype
.Object.prototype
ist der letzte Mann in der Prototypenkette. Ich meine, es wurde nicht gebaut. Es ist bereits im System vorhanden. Also seine__proto__
Punkte zunull
.Nun kommen wir zu Instanzen von
Foo
. Wenn wir eine Instanz mit erstellennew Foo()
, wird ein neues Objekt erstellt, das eine Instanz von istFoo
. Das heißt, esFoo
ist der Konstruktor dieser Instanzen. Hier haben wir zwei Instanzen erstellt (x und y).__proto__
von x und y zeigt also aufFoo.prototype
.quelle
Zusammenfassung:
Die
__proto__
Eigenschaft eines Objekts ist eine Eigenschaft, dieprototype
der Konstruktorfunktion des Objekts zugeordnet ist. Mit anderen Worten:instance.__proto__ === constructor.prototype // true
Dies wird verwendet, um die
prototype
Kette eines Objekts zu bilden. Dieprototype
Kette ist ein Suchmechanismus für Eigenschaften eines Objekts. Wenn auf die Eigenschaft eines Objekts zugegriffen wird, überprüft JavaScript zuerst das Objekt selbst. Wenn das Grundstück dort nicht gefunden wird, steigt es bis zum anprotochain
ihrer Entdeckung (oder auch nicht).Beispiel:
Unser erstes Protokoll führt zu
true
, weil, wie erwähnt, die__proto__
Eigenschaft der vom Konstruktor erstellten Instanz auf die verweistprototype
Eigenschaft des . Denken Sie daran, dass Funktionen in JavaScript auch Objekte sind. Objekte können Eigenschaften haben, und eine Standardeigenschaft jeder Funktion ist eine Eigenschaft namens Prototyp.Wenn diese Funktion dann als Konstruktorfunktion verwendet wird, erhält das von ihr instanziierte Objekt eine aufgerufene Eigenschaft
__proto__
. Und diese__proto__
Eigenschaft bezieht sich auf dieprototype
Eigenschaft der Konstruktorfunktion (die standardmäßig jede Funktion hat).Warum ist das nützlich?
JavaScript verfügt über einen Mechanismus zum Nachschlagen von Eigenschaften,
Objects
der als "prototypische Vererbung" bezeichnet wird. Im Folgenden wird Folgendes ausgeführt:__proto__
Eigenschaft bezieht . Dort wird geprüft, ob die Eigenschaft für das Objekt verfügbar ist, auf das von verwiesen wird__proto__
.__proto__
Objekt befindet, klettert sie die__proto__
Kette hinauf bis zumObject
Objekt.prototype
Kette gefunden werden kann, wird sie zurückgegebenundefined
.Zum Beispiel:
quelle
Ich lerne zufällig Prototypen von You Don't Know JS: this & Object Prototypes , ein wunderbares Buch, um das darunter liegende Design zu verstehen und so viele Missverständnisse zu klären (deshalb versuche ich, Vererbung und ähnliches zu vermeiden
instanceof
).Aber ich habe die gleiche Frage wie die Leute, die hier gestellt wurden. Einige Antworten sind wirklich hilfreich und aufschlussreich. Ich würde auch gerne mein Verständnis teilen.
Was ist ein Prototyp?
Objekte in JavaScript haben eine interne Eigenschaft, die in der Spezifikation als
[[Prototype]]
bezeichnet wird und lediglich auf ein anderes Objekt verweist. Fast alle Objekte erhalten eine Nicht-null
zum Zeitpunkt ihrer Erstellung für diese Eigenschaft.Wie bekomme ich den Prototyp eines Objekts?
über
__proto__
oderObject.getPrototypeOf
Was ist das
prototype
?prototype
ist ein Objekt, das automatisch als spezielle Eigenschaft einer Funktion erstellt wird und zum Einrichten der Delegierungskette (Vererbungskette), auch als Prototypkette bezeichnet, verwendet wird.Wenn wir eine Funktion erstellen
a
,prototype
wird automatisch als besondere Eigenschaft erstellt aufa
und speichert den Funktionscode auf alsconstructor
aufprototype
.Ich würde diese Eigenschaft gerne als Speicherort für die Eigenschaften (einschließlich Methoden) eines Funktionsobjekts betrachten. Dies ist auch der Grund, warum Dienstprogrammfunktionen in JS wie folgt definiert
Array.prototype.forEach()
werdenFunction.prototype.bind()
:Object.prototype.toString().
Warum die Eigenschaft einer Funktion hervorheben ?
Also
Arary
,Function
,Object
sind alle Funktionen. Ich sollte zugeben, dass dies meinen Eindruck auf JS auffrischt. Ich weiß, dass Funktionen in JS erstklassige Bürger sind, aber es scheint, dass sie auf Funktionen basieren.Was ist der Unterschied zwischen
__proto__
undprototype
?__proto__
Eine Referenz bearbeitet jedes Objekt , um auf seine[[Prototype]]
Eigenschaft zu verweisen .prototype
ist ein Objekt, das automatisch als spezielle Eigenschaft einer Funktion erstellt wird wird und zum Speichern der Eigenschaften (einschließlich Methoden) eines Funktionsobjekts verwendet wird.Mit diesen beiden konnten wir die Prototypenkette mental abbilden. Wie dieses Bild zeigt:
quelle
In JavaScript hat jedes Objekt (Funktion ist auch Objekt!) Eine
__proto__
Eigenschaft, die Eigenschaft verweist auf seinen Prototyp.Wenn wir den
new
Operator mit einem Konstruktor verwenden, um ein neues Objekt zu erstellen, wird die__proto__
Eigenschaft des neuen Objekts mit der des Konstruktors festgelegtprototype
Eigenschaft des Konstruktors festgelegt, und der Konstruktor wird vom neuen Objekt aufgerufen. In diesem Prozess ist "this" eine Referenz auf das neue Objekt Geben Sie im Konstruktorbereich schließlich das neue Objekt zurück.Der Prototyp des Konstruktors ist eine
__proto__
Eigenschaft, dieprototype
Eigenschaft eines Konstruktors ist die Arbeit mit demnew
Operator.Der Konstruktor muss eine Funktion sein, aber die Funktion ist nicht immer ein Konstruktor, selbst wenn sie eine
prototype
Eigenschaft hat.Die Prototypkette ist tatsächlich die
__proto__
Eigenschaft des Objekts, auf seinen Prototyp zu verweisen, und die__proto__
Eigenschaft des Prototyps, auf den Prototyp des Prototyps zu verweisen, und so weiter, bis auf die Eigenschaft des Objektprototyps__proto__
verwiesen wird, die auf null verweist.Zum Beispiel:
[[Prototype]]
und__proto__
Eigentum ist eigentlich dasselbe.Wir können die getPrototypeOf-Methode von Object verwenden, um den Prototyp eines Objekts abzurufen.
Jede von uns geschriebene Funktion kann verwendet werden, um mit dem
new
Operator ein Objekt zu erstellen , sodass jede dieser Funktionen ein Konstruktor sein kann.quelle
Ein weiterer guter Weg, um es zu verstehen:
Erst nachdem IE11
__proto__
unterstützt wird. Vor dieser Version, wie z. B. IE9, konnten Sie die verwendenconstructor
, um die zu erhalten__proto__
.quelle
Prototyp
Prototyp ist eine Eigenschaft einer Funktion. Dies ist die Blaupause zum Erstellen von Objekten mithilfe dieser (Konstruktor-) Funktion mit einem neuen Schlüsselwort.
__proto__
wird in der Suchkette verwendet, um Methoden und Eigenschaften aufzulösen. Wenn ein Objekt erstellt wird (unter Verwendung der Konstruktorfunktion mit neuem Schlüsselwort),__proto__
wird es auf (Konstruktor) Function.prototype gesetztHier ist meine (imaginäre) Erklärung, um die Verwirrung zu beseitigen:
Stellen Sie sich vor, es gibt eine imaginäre Klasse (Blueprint / Coockie Cutter), die der Funktion zugeordnet ist. Diese imaginäre Klasse wird verwendet, um Objekte zu instanziieren.
prototype
ist der Erweiterungsmechanismus (Erweiterungsmethode in C # oder Swift Extension), um dieser imaginären Klasse Dinge hinzuzufügen.Das Obige kann man sich vorstellen als:
Damit,
Fügen Sie nun eine Methode zum
prototype
of Robot hinzu:Das Obige kann als Erweiterung der Roboterklasse vorgestellt werden:
Was wiederum,
quelle
__proto__
und Prototypen. vielleicht Prototyp und Vererbung?prototype
und__proto__
beides sollte vermieden werden. Wir haben jetzt Unterricht und ich mag OOP.Einfach gesagt:
Auf diese Weise können Sie Eigenschaften an X.prototype anhängen, nachdem Objekte vom Typ X instanziiert wurden, und sie erhalten weiterhin Zugriff auf diese neuen Eigenschaften über die __proto__- Referenz, mit der die Javascript-Engine die Prototypenkette durchläuft.
quelle
Prototype oder Object.prototype ist eine Eigenschaft eines Objektliteral. Es stellt das Objekt Prototyp - Objekt , das Sie überschreiben können mehr Eigenschaften oder Methoden weiter entlang der Prototypkette hinzuzufügen.
__proto__ ist eine Accessor-Eigenschaft (Funktion zum Abrufen und Festlegen ), die den internen Prototyp eines Objekts verfügbar macht, über das zugegriffen wird.
Verweise:
http://www.w3schools.com/js/js_object_prototypes.asp
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/proto
quelle
Object.prototype
ist keine Eigenschaft eines Objektliteral, beim Versuch,{}.prototype
Rückgaben undefiniert auszudrucken ; Es kann jedoch über zugegriffen werden{}.__proto__
, was zurückkehrtObject.prototype
.Ich weiß, ich bin spät dran, aber lassen Sie mich versuchen, es zu vereinfachen.
Nehmen wir an, es gibt eine Funktion
Bei der Foo-Funktion wird ein Prototypobjekt verknüpft. Wenn wir also eine Funktion in JavaScript erstellen, ist immer ein Prototypobjekt damit verknüpft.
Lassen Sie uns nun zwei Objekte mit der Funktion Foo erstellen.
Nun, Foo.prototype, a. Proto und b. proto all bezeichnet dasselbe Objekt.
alles oben Genannte würde wahr zurückgeben.
Wie wir wissen, können in JavaScript Eigenschaften dynamisch hinzugefügt werden. Wir können dem Objekt eine Eigenschaft hinzufügen
Wie Sie sehen, haben wir in Foo.prototype die Greet () -Methode hinzugefügt, auf die jedoch in a und b oder in jedem anderen Objekt zugegriffen werden kann, das mit Foo erstellt wurde.
Während der Ausführung von a.Greet () durchsucht JavaScript zuerst Greet in Objekt a in der Eigenschaftsliste. Wenn es nicht gefunden wird, wird es in der Protokette von a hochgehen . Seit einem. proto und Foo.prototype sind dasselbe Objekt, JavaScript findet die Greet () -Methode und führt sie aus.
Ich hoffe, jetzt sind Prototyp und Proto etwas vereinfacht.
quelle
Erklärendes Beispiel:
Jetzt hat myPupppie eine
__proto__
Eigenschaft, die auf Dog.prototype verweist.myPuppie hat jedoch KEINE Prototyp-Eigenschaft.
Also,
__proto__
von mypuppie ist der Verweis auf die .prototype Eigenschaft der Konstruktor - Funktion , die verwendet wurde , um dieses Objekt zu instanziieren (und das aktuelle myPuppie Objekt „Delegierten“ Beziehung zu diesem__proto__
Objekt), während .prototype Eigenschaft myPuppie einfach nicht vorhanden ist (da wir haben es nicht eingestellt).Gute Erklärung von MPJ hier: Proto vs Prototyp - Objekterstellung in JavaScript
quelle
Ich habe für mich eine kleine Zeichnung erstellt, die den folgenden Codeausschnitt darstellt:
Ich habe einen klassischen OO-Hintergrund, daher war es hilfreich, die Hierarchie auf diese Weise darzustellen. Behandeln Sie die Rechtecke im Bild als JavaScript-Objekte, damit Sie dieses Diagramm besser lesen können. Und ja, Funktionen sind auch Objekte. ;)
Objekte in JavaScript haben Eigenschaften und
__proto__
sind nur eine davon.Die Idee hinter dieser Eigenschaft ist, auf das Vorfahrenobjekt in der (Vererbungs-) Hierarchie zu verweisen.
Das Stammobjekt in JavaScript ist
Object.prototype
und alle anderen Objekte sind Nachkommen dieses Objekts . Die__proto__
Eigenschaft des Stammobjekts istnull
, das das Ende der Vererbungskette darstellt.Sie werden feststellen, dass dies
prototype
eine Eigenschaft von Funktionen ist.Cat
ist eine Funktion, aber auchFunction
undObject
sind (native) Funktionen.tom
ist keine Funktion, hat also diese Eigenschaft nicht.Die Idee hinter dieser Eigenschaft ist, auf ein Objekt zu verweisen, das in der Konstruktion verwendet wird, dh wenn Sie den
new
Operator für diese Funktion aufrufen .Wenn wir das
tom
Objekt mit erstellennew Cat()
, wird für das erstellte Objekt die__proto__
Eigenschaft auf dasprototype
Objekt der Konstruktorfunktion festgelegt.Lassen Sie uns am Ende ein wenig mit diesem Diagramm spielen. Die folgenden Aussagen sind wahr:
tom.__proto__
Eigenschaft zeigt auf dasselbe Objekt wieCat.prototype
.Cat.__proto__
zeigt auf dasFunction.prototype
Objekt, genau wieFunction.__proto__
undObject.__proto__
tun.Cat.prototype.__proto__
undtom.__proto__.__proto__
auf das gleiche Objekt zeigen und das istObject.prototype
.Prost!
quelle
tom.__proto__
undCat.prototype
sind streng gleich, also,tom.__proto__ === Cat.prototype
undCat.prototype === tom.__proto__
sind wahr. Also, was hast du mit dem Pfeil im Bild gemeint?prototype
ist das Eigentum desCat
Objekts (aus Ihrer Frage).DEFINITIONEN
(Die Zahl in Klammern () ist ein 'Link' zu dem unten angegebenen Code.)
prototype
- ein Objekt, das besteht aus:=> Funktionen (3) dieses bestimmten
ConstructorFunction.prototype
(5), auf die jedes Objekt (4) zugreifen kann, das über diese Konstruktorfunktion (1) erstellt wurde oder erstellt werden soll (1)=> der Konstruktorfunktion selbst (1) )
=>
__proto__
dieses bestimmten Objekts (Prototypobjekt)__proto__
(dandor proto?) - eine Verknüpfung zwischen einem Objekt (2), das durch eine bestimmte Konstruktorfunktion (1) erstellt wurde, UND den Eigenschaften des Prototypobjekts (5) dieses Konstruktors, die jedem erstellten Objekt (2) den Zugriff auf die Funktionen des Prototyps ermöglichen und Methoden (4) (__proto__
ist standardmäßig in jedem einzelnen Objekt in JS enthalten)CODE-ERKLÄRUNG
1.
2.
3.
4.
5.
quelle
Ich werde eine Erklärung für die 4. Klasse versuchen:
Die Dinge sind sehr einfach. A
prototype
ist ein Beispiel dafür, wie etwas gebaut werden sollte. Damit:Ich bin ein
function
und baue neue Objekte ähnlich meinenprototype
Ich bin ein
object
und ich wurde mit meinem__proto__
als Beispiel gebautBeweis :
quelle
prototype
noch a__proto__
werden zu irgendeinem Zeitpunkt als Blaupause oder so verwendet, um ein Objekt zu erstellen. Dies ist ein Mythos, der durch die verschwommeneclass
Syntax und ihre Vorgänger eingeführt wurde. Wie der Antwort-Post sagt, wird er nur für die Suchkette und für den Fall derprototype
Identifizierungconstructor
verwendetnew
(was Teil dieses Mechanismus ist, der vorgibt, klassisch zu sein, der viele Benutzer, einschließlich mich, verwirrt).Jede von Ihnen erstellte Funktion hat eine Eigenschaft namens
prototype
und beginnt ihr Leben als leeres Objekt. Diese Eigenschaft ist erst dann von Nutzen, wenn Sie diese Funktion als Konstruktorfunktion verwenden, dh mit dem Schlüsselwort 'new'.Dies wird oft mit der
__proto__
Eigenschaft eines Objekts verwechselt . Einige könnten verwirrt werden und außer dass dieprototype
Eigenschaft eines Objekts sie zum Proto eines Objekts machen könnte. Dies ist jedoch nicht der Fall.prototype
wird verwendet, um das__proto__
eines Objekts abzurufen, das aus einem Funktionskonstruktor erstellt wurde.Im obigen Beispiel:
Ich hoffe es macht Sinn.
quelle
prototype
wird nicht zum Erstellen__proto__
eines Objekts verwendet.__proto__
liefert beim Zugriff lediglich einen Verweis auf dasprototype
Objekt.Was ist mit
__proto__
statischen Methoden?quelle
__proto__
VS.prototype
in JavaScript" ?Versuchen Sie diesen Code zu verstehen
quelle
Es gibt nur ein Objekt, das für die protypische Verkettung verwendet wird. Dieses Objekt hat offensichtlich einen Namen und einen Wert:
__proto__
ist sein Name undprototype
ist sein Wert. Das ist alles.Um es noch einfacher zu verstehen, schauen Sie sich das Diagramm oben in diesem Beitrag an (Diagramm von dmitry soshnikov). Sie werden niemals
__proto__
Punkte auf etwas anderes als findenprototype
als seinen Wert finden.Das Wesentliche ist: Ist
__proto__
der Name, der auf das prototypische Objekt verweist, undprototype
ist das eigentliche prototypische Objekt.Es ist wie zu sagen:
x
ist der Objektname (Zeiger) und{name: 'john'}
ist das tatsächliche Objekt (Datenwert).HINWEIS: Dies ist nur ein massiv vereinfachter Hinweis darauf, wie sie auf hoher Ebene zusammenhängen.
Update: Hier ist ein einfaches konkretes Javascript-Beispiel zur besseren Veranschaulichung:
Dies bedeutet, dass wenn
Object.getPrototypeOf(x)
wir den tatsächlichen Wert vonx
(der sein Prototyp ist) erhalten, genau das ist, worauf der__proto__
vonx
zeigt. Daher__proto__
weist in der Tat auf den Prototyp vonx
. Somit__proto__
verweistx
(Zeiger vonx
) undprototype
ist der Wert vonx
(seinem Prototyp).Ich hoffe es ist jetzt ein bisschen klar.
quelle
Dies ist eine sehr wichtige Frage, die für jeden relevant ist, der die prototypische Vererbung verstehen möchte. Soweit ich weiß, wird der Prototyp standardmäßig zugewiesen, wenn ein Objekt mit new aus einer Funktion erstellt wird, da Function per Definition ein Prototypobjekt hat:
Wenn wir ein gewöhnliches Objekt ohne neues erstellen, dh explizit aus einer Funktion, hat es keinen Prototyp, aber es hat ein leeres Proto , dem ein Prototyp zugewiesen werden kann.
Wir können Object.create verwenden, um ein Objekt explizit zu verknüpfen.
quelle
__proto__
ist die zu konstruierende Basisprototype
und eine Konstruktorfunktion, zB:function human(){}
has,prototype
die über__proto__
in der neuen Instanz der Konstruktorfunktion geteilt wird. Eine ausführlichere Lektüre finden Sie hierquelle
Wie dies zu Recht festgestellt wurde
Wir können ferner feststellen, dass die
__proto__
Eigenschaft eines Objekts, das mit dem Funktionskonstruktor erstellt wurde, auf den Speicherort zeigt, auf den der Prototyp zeigt des jeweiligen Konstruktors zeigt.Wenn wir den Speicherort des Prototyps der Konstruktorfunktion ändern, zeigt das
__proto__
abgeleitete Objekt weiterhin auf den ursprünglichen Adressraum. Um gemeinsame Eigenschaften in der Vererbungskette verfügbar zu machen, hängen Sie daher die Eigenschaft immer an den Prototyp der Konstruktorfunktion an , anstatt sie neu zu initialisieren (wodurch sich ihre Speicheradresse ändern würde).Betrachten Sie das folgende Beispiel:
quelle
Mein Verständnis ist: __proto__ und Prototyp werden alle für die Prototypenkettentechnik bereitgestellt. Der Unterschied besteht darin, dass Funktionen mit Unterstrich (wie __proto__) nicht für Entwickler gedacht sind, die explizit aufgerufen werden. Mit anderen Worten, sie sind nur für einige Mechanismen wie Erben usw. gedacht. Sie sind "Back-End". Funktionen ohne Unterstrich sind jedoch für den expliziten Aufruf vorgesehen. Sie sind "Front-End".
quelle
__proto__
undprototype
als nur die Namenskonvention. Sie können auf dasselbe Objekt zeigen oder nicht. Siehe @ Zyklus Antwort.!!! DAS IST DIE BESTE ERKLÄRUNG DER WELT !!!!!
In Funktionskonstruktoren ruft die Javascript-Engine dies
q.__proto__ = prototype
automatisch auf, wenn wir schreibennew Class
, und in das__proto__
RequisitensetClass.prototype
Genießen %)
quelle