Wie funktioniert JavaScript .prototype?
Bin ich nicht, dass in dynamischen Programmiersprachen, aber ich habe geschrieben meinen Gerechten Anteil von JavaScript-code. Ich habe nie wirklich meinen Kopf um diese Prototyp-basierte Programmierung, hat jemand wissen, wie das funktioniert?
var obj = new Object(); //not a functional object
obj.prototype.test = function() { alert('Hello?'); }; //this is wrong!
function MyObject() {} //a first class functional object
MyObject.prototype.test = function() { alert('OK'); } //OK
Ich erinnere mich an eine Menge Diskussion, die ich mit den Leuten hatte, eine Weile zurück (ich bin mir nicht ganz sicher bin, was ich Tue), aber wie ich es verstehe, gibt es kein Konzept einer Klasse. Es ist nur ein Objekt, und Instanzen dieser Objekte sind Klone der ursprünglichen, richtigen?
Aber was ist der genaue Zweck dieser .prototype
- Eigenschaft in JavaScript? In welcher Beziehung steht es zu instanziieren Objekte?
Bearbeiten
Diese Folien wirklich geholfen, eine Menge, um dieses Thema zu verstehen.
InformationsquelleAutor der Frage John Leidegren | 2009-02-21
Du musst angemeldet sein, um einen Kommentar abzugeben.
Jedes JavaScript-Objekt hat eine interne Eigenschaft, die man als [[Prototype]]. Wenn Sie schauen, eine Eigenschaft, die über
obj.propName
oderobj['propName']
und das Objekt keine solche Eigenschaft - die überprüft werden können, überobj.hasOwnProperty('propName')
- die Laufzeitumgebung sucht nach die Eigenschaft im Objekt verwiesen wird, die von [[Prototype]] statt. Wenn der Prototyp-Objekt auch nicht wie ein Eigentum, dessen Prototyp überprüft wiederum, so gehen die ursprünglichen Objekts Prototyp-Kettebis eine übereinstimmung gefunden wird oder sein Ende erreicht ist.Einige JavaScript-Implementierungen erlauben den direkten Zugriff auf die [[Prototype]] - Eigenschaft, zB über eine nicht-standard-Eigenschaft mit dem Namen
__proto__
. Im Allgemeinen ist es nur möglich, um ein Objekt dem Prototyp während der Objekt-Erstellung: Wenn Sie ein neues Objekt erstellen übernew Func()
des Objekts [[Prototype]] - Eigenschaft wird festgelegt, auf das Objekt verwiesen wird, die vonFunc.prototype
.Dies ermöglicht es, zu simulieren, Klassen in JavaScript obwohl JavaScript-Vererbung-system ist - wie wir gesehen haben - prototypische und nicht-klassenbasierten:
Denken Sie nur Konstruktor-Funktionen Klassen und die Eigenschaften des Prototyps (dh des referenzierten Objekts durch den Konstruktor-Funktion ist
prototype
Eigenschaft) als gemeinsame Mitglieder, dh-Mitglieder, die das gleiche für jede Instanz. In der Klasse-basierte Systeme, - Methoden implementiert, die gleiche Weise für jede Instanz, also Methoden werden normalerweise Hinzugefügt, um den Prototyp, in der Erwägung, dass ein Objekt die Felder Instanz-spezifisch sind und deshalb Hinzugefügt, um das Objekt selbst während der Bauphase.InformationsquelleAutor der Antwort Christoph
Ich Spiele eine Rolle als JavaScript-Lehrer und der Prototyp-Konzept war schon immer ein umstrittenes Thema abdecken, wenn ich unterrichte. Es dauerte eine Weile, um zu kommen mit eine gute Methode, zu klären, das Konzept, und jetzt in diesem text werde ich versuchen zu erklären, Wie funktioniert JavaScript .Prototyp arbeiten.
Dies ist eine sehr einfache Prototyp-basierten Objekt-Modell, dass würde als eine Probe, die während der Erläuterung, ohne Kommentar noch:
Gibt es einige entscheidende Punkte, die wir berücksichtigen müssen, bevor wir über das Prototyp-Konzept.
1 - Wie JavaScript-Funktionen, die wirklich funktionieren:
Den ersten Schritt zu nehmen, müssen wir herausfinden, wie JavaScript-Funktionen, die wirklich funktionieren , da eine Klasse wie die Funktion mit
this
keyword oder halt als normale Funktion mit den Argumenten, was Sie tut und was Sie zurückgibt.Sagen wir, wir möchten, erstellen Sie eine
Person
- Objekt-Modell. aber in diesem Schritt werde ich versuchen, tun exakt das gleiche Sache, ohne die Verwendungprototype
undnew
Stichwort.So, in diesem Schritt
functions
objects
undthis
Schlüsselwort, sind alles, was wir haben.Die erste Frage wäre wie
this
Stichwort könnte hilfreich sein, ohne mitnew
Stichwort.So zu beantworten, dass wir sagen, wir haben ein leeres Objekt, und zwei Funktionen, wie:
und jetzt ohne Verwendung
new
Stichwortwie wir diese Funktionen verwenden. Also in JavaScript gibt es 3 verschiedene Möglichkeiten, das zu tun:ein. erste Möglichkeit ist einfach, rufen Sie die Funktion wie eine normale Funktion:
in diesem Fall wäre der aktuelle Kontext-Objekt, das in der Regel ist die Globale
window
Objekt im browser oderGLOBAL
imNode.js
. Es heißt, wir müssten, Fenster.Namen im browser oder GLOBAL.name in Node.js mit "George" als seinen Wert.b. Wir können befestigen Sie auf ein Objekt, dessen Eigenschaften
-Der einfachste Wegdies zu tun ist die änderung der leeren
person
Objekt, wie:diese Weise können wir rufen Sie gerne:
und jetzt die
person
Objekt ist wie:-Den anderen Weg, um das Anhängen einer Eigenschaftum ein Objekt mithilfe der
prototype
des Objekts, werden kann finden Sie in der JavaScript Objekt mit dem Namen__proto__
und ich habe versucht zu erklären, es ein wenig an der übersicht Teil. So konnten wir das ähnliche Ergebnis von doing:Aber diese Weise das, was wir tatsächlich tun, ist die änderung der
Object.prototype
denn Wann immer wir erstellen ein JavaScript-Objekt mit literalen ({ ... }
), wird es erstellt, basierend aufObject.prototype
was bedeutet, es wird befestigt, um das neu erstellte Objekt als Attribut mit dem Namen__proto__
, so dass, wenn wir es ändern, wie wir getan haben auf unseren vorherigen code-snippet, alle JavaScript-Objekte geändert werden, sind nicht eine gute Praxis. Also, was könnte die bessere Praxis jetzt:und nun andere Objekte in Ruhe, aber es immer noch nicht scheinen, um eine gute Praxis. So haben wir noch eine weitere Lösungen, aber diese Lösung sollten wir uns wieder auf, dass die Codezeile, wo
person
Objekt erstellt habe (var person = {};
), dann ändern Sie es wie:was es tut, ist erstellen Sie eine neue JavaScript -
Object
an und befestigen Sie diepropertiesObject
zu den__proto__
Attribut. So stellen Sie sicher, dass Sie tun können:Aber der schwierige Punkt ist hier, haben Sie Zugriff auf alle Eigenschaften definiert, die in
__proto__
auf der ersten Ebene derperson
- Objekt(Lesen Sie die Zusammenfassung zum Teil für mehr detail).als Sie sehen, mit diesen zwei Weise
this
wäre genau der Punkt, um denperson
Objekt.c. JavaScript ist ein weiterer Weg, um die Funktion mit
this
die mit rufen oder bewerben zum aufrufen der Funktion.und
diese Weise, die ist mein Liebling, wir können einfach rufen Sie unsere Funktionen wie:
oder
diese 3 Methoden sind wichtige erste Schritte, um herauszufinden, die .Prototyp-Funktionalität.
2 - Wie funktioniert das
new
Stichwort funktioniert?dies ist der zweite Schritt zu verstehen, die
.prototype
Funktionalität.dies ist, was ich verwenden, um den Prozess simulieren:in diesem Teil werde ich versuchen, alle Schritte, die JavaScript nimmt, ohne mit der
new
Schlüsselwort undprototype
wenn Sienew
Schlüsselwort. also, wenn wir tunnew Person("George")
Person
Funktion dient als Konstruktor, Diese sind das, was JavaScript macht, eins nach dem anderen:ein. Erstens macht es ein leeres Objekt, im Grunde eine leere hash wie:
b. der nächste Schritt, der JavaScript braucht, um befestigen die alle Prototyp-Objekte auf das neu erstellte Objekt
wir haben
my_person_prototype
hier ähnlich dem Prototyp-Objekt.Es ist nicht die Art und Weise, dass JavaScript tatsächlich legt die Eigenschaften, die definiert sind in dem Prototyp. Die tatsächliche Art und Weise ist in Bezug auf die prototype-chain-Konzept.
ein. & b. Im Gegensatz zu diesen beiden Schritten können Sie haben genau das gleiche Ergebnis, indem Sie tun:
nun nennen wir die
getName
Funktion in unseremmy_person_prototype
:c. dann gibt es das Objekt an den Konstruktor,
dies können wir mit unserem sample-wie:
oder
dann der Konstruktor kann tun, was es will, weil diese die im inneren des Konstruktors ist das Objekt, das gerade erstellt wurde.
nun das Endergebnis vor der Simulation die weiteren Schritte:
Object {name: "George"}
Zusammenfassung:
Grundsätzlich, wenn Sie die neue Schlüsselwort für eine Funktion, die Sie fordern, und diese Funktion dient als Konstruktor, so, wenn Sie sagen:
JavaScript intern macht ein Objekt, wird eine leere hash-und dann gibt es das Objekt an den Konstruktor übergeben, dann wird der Konstruktor kann tun, was es will, weil diese die im inneren des Konstruktors ist das Objekt, das Sie gerade erstellt haben und dann gibt es Ihnen das Objekt natürlich, wenn Sie haven ' T verwendet die return-Anweisung in der Funktion, oder wenn Sie haben eine
return undefined;
am Ende Ihrer Funktion Körper.So, wenn JavaScript geht zu schauen, eine Eigenschaft auf ein Objekt, das erste, was Sie tut, ist, sucht er es auf das Objekt. Und dann gibt es eine geheime Eigenschaft
[[prototype]]
die in der Regel haben wir es wie__proto__
und diese Eigenschaft ist, was JavaScript sieht auf den nächsten. Und wenn es so aussieht, durch die__proto__
wie weit es ist wieder ein JavaScript-Objekt, es hat seine eigene__proto__
Attribut, es geht höher und höher, bis es zu dem Punkt, wo sich die nächste__proto__
null ist. Der Punkt ist das einzige Objekt in JavaScript, das seine__proto__
Attributs null istObject.prototype
Objekt:und das ist, wie die Vererbung funktioniert in JavaScript.
In anderen Worten, wenn Sie haben eine prototype-Eigenschaft, die auf eine Funktion und rufen Sie eine neue auf, die nach JavaScript-Ausführungen an, dass der neu erstellte Objekt für Eigenschaften, es wird gehen, sehen Sie bei der Funktion
.prototype
und auch es ist möglich, dass dieses Objekt hat seinen eigenen internen Prototyp. und so weiter.InformationsquelleAutor der Antwort Mehran Hatami
prototype
können Sie Klassen. wenn Sie nicht verwendenprototype
dann wird es eine statische.Hier ist ein kurzes Beispiel.
Im obigen Fall, Sie haben statische funcation call test. Diese Funktion kann nur zugegriffen werden, die durch obj.testen Sie, wo Sie sich vorstellen können, obj eine Klasse.
wo, wie im code unten
Obj hat eine Klasse, die kann jetzt instanziiert werden. Mehrere Instanzen von obj vorhanden sein können, und Sie alle haben die
test
Funktion.Oben ist mein Verständnis. Ich bin so dass es ein community-wiki, so dass die Leute können mich korrigieren, wenn ich falsch bin.
InformationsquelleAutor der Antwort
Nach der Lektüre dieses Threads, ich fühle mich verwirrt mit JavaScript-Prototype-Chain, dann fand ich diese charts
http://iwiki.readthedocs.org/en/latest/javascript/js_core.html#inheritance
es ist eine klare Diagramm, um zu zeigen, JavaScript Vererbung durch Prototypen-Kette
und
http://www.javascriptbank.com/javascript/article/JavaScript_Classical_Inheritance/
diese enthält ein Beispiel mit code und mehrere schöne Diagramme.
Hoffe, es ist auch hilfreich für Sie zu verstehen JavaScript-Prototype-Chain.
InformationsquelleAutor der Antwort rockXrock
Die sieben Koans der Prototyp
Ciro San abstammen Mount Fire Fox nach tiefer meditation wurde sein Geist klar und friedvoll.
Seine hand war jedoch unruhig, und durch sich selbst ergriff eine Bürste und notierte die folgenden Hinweise.
0) Zwei verschiedene Dinge, die man als "Prototyp":
die prototype-Eigenschaft, wie in
obj.prototype
den Prototyp der internen Eigenschaft, so bezeichnet man dies als
[[Prototype]]
in ES5.Abgerufen werden können, über die ES5
Object.getPrototypeOf()
.Firefox macht es zugänglich durch die
__proto__
Eigenschaft als Erweiterung. ES6 jetzt erwähnt einige optionale Anforderungen für__proto__
.1) Diese Konzepte existieren, um die Frage zu beantworten:
Intuitiv, klassische Vererbung beeinflussen property lookup.
2)
__proto__
wird verwendet, für den Punkt.
Eigenschaft lookup wie inobj.property
..prototype
ist nicht verwendet, für die Suche direkt, sondern nur indirekt, wie es bestimmt__proto__
bei Objekterstellung mitnew
.Lookup-Reihenfolge ist:
obj
Eigenschaften Hinzugefügt, mitobj.p = ...
oderObject.defineProperty(obj, ...)
obj.__proto__
obj.__proto__.__proto__
und so weiter__proto__
istnull
zurückundefined
.Dies ist die so genannte Prototyp-Kette.
Können Sie vermeiden
.
lookup mitobj.hasOwnProperty('key')
undObject.getOwnPropertyNames(f)
3) Es gibt zwei Möglichkeiten zum einstellen
obj.__proto__
:new
:dann
new
gesetzt hat:Diese ist, wo
.prototype
genutzt wird.Object.create
:sets:
4) code:
Entspricht dem folgenden Diagramm:
Dieses Diagramm zeigt viele Sprache vordefinierte Objekt-Knoten:
null
Object
Object.prototype
Function
undFunction.prototype
. Unsere 2 Zeilen code nur erstelltf
F
undF.prototype
.5)
.constructor
kommt normalerweise vonF.prototype
durch die.
- Suche:Wenn wir schreiben
f.constructor
JavaScript funktioniert die.
nachschlagen:f
nicht.constructor
f.__proto__ === F.prototype
hat.constructor === F
so nehmen SieDas Ergebnis
f.constructor == F
ist intuitiv richtig, daF
wird verwendet, um zu konstruierenf
z.B. Felder, ähnlich wie in der klassischen OOP-Sprachen.6) Klassische Vererbung-syntax kann erreicht werden durch die Manipulation der Prototypen-Ketten.
ES6 fügt die
class
undextends
keywords, die einfach syntax-Zucker für die bislang der Prototyp manipulation Wahnsinn.Vereinfachte Darstellung ohne alle vordefinierten Objekte:
InformationsquelleAutor der Antwort Ciro Santilli 新疆改造中心 六四事件 法轮功
Jedes Objekt hat eine interne Eigenschaft [[Prototype]], Verknüpfung zu einem anderen Objekt:
In der traditionellen javascript, das verknüpfte Objekt ist die
prototype
Eigenschaft einer Funktion:Einigen Umgebungen aussetzen [[Prototype]] als
__proto__
:Erstellen Sie die [[Prototype]] - link, wenn Sie ein Objekt erstellen.
Also diese Aussagen sind gleichwertig:
Einen
new
Anweisung nicht zeigen, das link-Ziel (Object.prototype
) selbst, sondern das Ziel ist implizit der Konstruktor (Object
).Denken Sie daran:
__proto__
.prototype
Eigenschaft.new
im Zusammenhang mit denprototype
Eigentum Ihrer Konstruktor.prototype
Eigenschaft ungenutzt.new
.InformationsquelleAutor der Antwort sam
Javascript nicht Vererbung im üblichen Sinne, aber es hat die Prototyp-Kette.
Prototyp-Kette
Wenn ein Mitglied ein Objekt kann nicht gefunden werden in dem Objekt, so sieht es in der Prototyp-Kette. Die Kette besteht aus anderen Objekten. Der Prototyp einer gegebenen Instanz zugegriffen werden kann, mit der
__proto__
variable. Jedes Objekt hat einen, da es keinen Unterschied zwischen Klassen und Instanzen in javascript.Den Vorteil, das hinzufügen einer Funktion /Variablen zu den Prototypen ist, dass es in der Erinnerung nur einmal, nicht für jede Instanz.
Es ist auch nützlich für die Vererbung, da die Prototyp-Kette kann aus vielen anderen Objekten.
InformationsquelleAutor der Antwort Georg Schölly
Dieser Artikel ist lang. Aber ich bin sicher, es wird klar, dass die meisten Ihrer Abfragen
in Bezug auf die "prototypische" Natur von JavaScript-Vererbung. Und sogar noch mehr. Bitte Lesen Sie den vollständigen Artikel.
JavaScript hat im Grunde zwei Arten von Datentypen
Nicht Objekte
Folgenden sind die Nicht Objekt Datentypen
Diese Datentypen zurück folgenden, wenn Sie die typeof Betreiber
typeof "string-literal" (oder eine variable, die string-literal) === 'string'
typeof 5 (oder einen beliebigen numerischen literal oder eine variable mit numerischen literal oder NaN oder Infynity) === 'Anzahl'
typeof wahr (oder false oder eine variable, die wahr oder false) === 'boolean'
typeof undefined (oder eine Undefinierte variable oder eine variable, die undefined) === 'undefined'
Den string,Anzahl und boolean Datentypen dargestellt werden können, sowohl als Objekte und Nicht Objekte.Wenn Sie als Objekte dargestellt werden, die Ihre typeof ist immer === 'object'. Wir werden darauf zurückkommen, sobald wir verstehen die Objekt-Datentypen.
Objekte
Den Objekt-Datentypen können weiter unterteilt werden in zwei Arten
Den - Funktion-Typ-Objekte sind diejenigen, die den string "Funktion" mit typeof Betreiber.
Alle vom Benutzer definierten Funktionen und alle JavaScript Objekte erstellen können neue Objekte über den operator new, fallen in diese Kategorie. Für zB.
So,
typeof(Object) === typeof(String) === typeof(Anzahl) === typeof(Boolean) === typeof(Array) === typeof(RegExp) === typeof(Funktion) === typeof(UserDefinedFunction) = = = "Funktion"
Alle - Funktion-Typ-Objekte sind eigentlich Instanzen der eingebauten JavaScript-Objekt Funktion (einschließlich der Funktion Objekt-ich.e es ist rekursiv definiert). Es ist, als ob diese Objekte wurden definiert, in der folgenden Weise
Wie bereits erwähnt, die - Funktion-Typ-Objekte können weitere erstellen Sie neue Objekte mit dem neuen Betreiber. Für e.g ein Objekt vom Typ ObjektStringAnzahlBooleanArrayRegExp Oder UserDefinedFunction können erstellt werden, mithilfe
Die Objekte, die damit erstellt werden, sind alle Nicht-Funktion-Typ-Objekte und Rückgabe Ihrer typeof==='Objekt'. In all diesen Fällen ist das Objekt "a" nicht weiter schaffen
Objekte mit operator new. Also Folgendes ist falsch
Dem built in-Objekt Mathematik ist typeof==='Objekt'. Daher wird ein neues Objekt vom Typ Math kann nicht erstellt werden, durch die neuen Betreiber.
Beachten Sie auch, dass Objekt,Array und RegExp Funktionen können Sie ein neues Objekt erstellen auch ohne Verwendung operator new. Aber Folgendes nicht.
Der user defined functions sind spezielle Fall.
Da die - Funktion-Typ-Objekte können neue Objekte erstellen, nennt man Sie auch Konstruktoren.
Jeder Konstruktor/Funktion (eingebaut in oder Benutzerdefiniert), wenn Sie automatisch definiert eine Eigenschaft namens " "Prototyp"dessen Wert standardmäßig eingestellt ist als ein Objekt. Das Objekt selbst hat eine Eigenschaft namens " "Konstruktor"die standardmäßig Referenzen zurück, die Konstruktor/Funktion .
Wenn wir zum Beispiel eine Funktion definieren, die
folgende geschieht automatisch
Diese "prototype" - Eigenschaft ist nur vorhanden in der - Funktion-Typ-Objekte
(und nie in Nicht-Funktion-Typ-Objekte).
Dies ist, weil wenn ein neues Objekt erstellt wird (mittels new-operator)es erbt alle Eigenschaften und Methoden-Konstruktor-Funktion, die aktuelle Prototyp-Objekt, d.h. eine interne Referenz erstellt wird, in das neu erstellte Objekt, das Referenzen die referenzierten Objekts durch Konstruktor-Funktion der aktuellen Prototyp-Objekt.
Diese "interne Referenz"die erstellt wird, in das Objekt für die Referenzierung von vererbten Eigenschaften ist bekannt als die Objekt-Prototyp - (die Verweise, die referenzierten Objekts durch Konstruktor "Prototyp" Eigenschaft aber ist anders als es). Für jedes Objekt (Funktion oder Nicht-Funktion) diese können abgerufen werden, mit Objekt.getPrototypeOf() Methode. Mit dieser Methode kann man der Spur der Prototypkette des Objekts.
Auch, jedes Objekt, das erstellt wird, (Funktion Typ oder Nicht-Funktion geben) hat eine "Konstruktor" Eigenschaft, die vererbt wird von dem Objekt referenzierten Eigenschaft prototype der Konstruktorfunktion. Standardmäßig ist diese "Konstruktor" - Eigenschaft verweist auf die Konstruktor-Funktionder es erstellt (wenn die Konstruktorfunktion Standard "Prototyp" ist, wird nicht verändert).
Für alle - Funktion-Typ-Objekte der Konstruktor wird immer
Funktion Funktion(){}
Für Nicht-Funktion-Typ-Objekte (e.g Javascript im Math-Objekt) der Konstruktor-Funktion ist die Funktion, die es erstellt.
Für Mathematik Objekt ist es Funktion Object(){}.
Alle das Konzept oben erklärt, kann ein wenig entmutigend sein, zu verstehen, ohne jegliche Unterstützung von code. Bitte gehen Sie durch den folgenden code Zeile für Zeile zu verstehen, das Konzept. Versuchen Sie zu ausführen es, ein besseres Verständnis.
Die Prototyp-Kette von jedem Objekt, das letztlich führt wieder zurück zum Objekt.Prototyp (die selbst keine Prototyp-Objekt) .
Folgende code kann verwendet werden, die für die Verfolgung der Prototypkette des Objekts
Die Prototyp-Kette für die verschiedenen Objekte wie folgt.
Funktion.Prototypen -> Object.Prototypen -> null
Für die Erstellung von ein Objekt ohne Prototyp verwenden Sie die folgenden:
Könnte man denken, dass das setzen der Eigenschaft prototype des Konstruktors zu null ist ein Objekt mit einem null-Prototyp. Jedoch in solchen Fällen die neu erzeugte Objekt dem Prototyp festgelegt ist, zu widersprechen.Prototyp und seinem Konstruktor gesetzt ist function-Objekt. Dies belegt der folgende code
Folgenden in der Zusammenfassung dieses Artikels
Nur - Funktion-Typ-Objekte erstellen kann ein neues Objekt mit der operator new. Die Objekte, die damit erstellt werden, sind Nicht-Funktion geben Objekte. Die Nicht-Funktion-Typ-Objekte nicht weiter ein Objekt erstellen mit operator new.
Alle - Funktion-Typ-Objekte haben standardmäßig eine "Prototyp" Eigenschaft. Diese "Prototyp" - Eigenschaft verweist auf ein Objekt, eine "Konstruktor" - Eigenschaft, die standardmäßig verweist auf die - Funktion-Typ-Objekt selbst.
Alle Objekte (Funktion Typ und Nicht-Funktion geben) haben eine "constructor" - Eigenschaft, die standardmäßig verweist auf die - Funktion-Typ-Objekt/Konstruktorder es erstellt.
Jedes Objekt, das erzeugt wird, intern Referenzen die referenzierten Objekts durch
"Prototyp" - Eigenschaft des Konstruktors, der es erstellt. Dieses Objekt bekannt ist, wie die erstellte Objekt-Prototyp - (die verschiedenen aus-Funktion Art-Objekte "prototype" - Eigenschaft, welche es sich bezieht) . Auf diese Weise erstelltes Objekt kann direkt auf die Methoden und Eigenschaften definiert in der referenzierten Objekts durch den Konstruktor der "prototype" - Eigenschaft (zum Zeitpunkt der Objekterstellung).
Einer Objekt-Prototyp - (und damit Ihre ererbten Namen der Eigenschaft) kann abgerufen werden, mithilfe der Objekt.getPrototypeOf() Methode. In der Tat ist diese Methode
kann verwendet werden für die Navigation in der gesamten Prototypkette des Objekts.
Die Prototyp-Kette von jedem Objekt, das letztlich führt wieder zurück zum Objekt.Prototyp (es sei denn, das Objekt erstellt wird mit dem Objekt.create(null) in diesem Fall hat das Objekt keine Prototypen).
typeof(new Array())==='object' ist durch die Gestaltung von Sprache und nicht ein Fehler wie schon von Douglas Crockford
Einstellung der Eigenschaft prototype des Konstruktors zu null(oder undefined,Zahl,true,false,string) wird nicht erstellen Sie ein Objekt mit einem null-Prototyp. In solchen Fällen wird das neu erzeugte Objekt dem Prototyp festgelegt ist, zu widersprechen.Prototyp und seinem Konstruktor gesetzt ist function-Objekt.
Hoffe, das hilft.
InformationsquelleAutor der Antwort Arup Hore
Dem Konzept der
prototypal
Vererbung ist eines der kompliziertesten für viele Entwickler. Lassen Sie uns versuchen zu verstehen, die Wurzel des Problems zu verstehenprototypal inheritance
besser. Beginnen wir mit einemplain
Funktion.Werden, wenn wir eine
new
Betreiber auf dieTree function
ist, nennen wir es alsconstructor
Funktion.Jeder
JavaScript
Funktion hat eineprototype
. Wenn Sie sich dieTree.prototype
...Wenn man sich die oben
console.log()
- Ausgang, könnte man einen constructor-Eigenschaft aufTree.prototype
und ein__proto__
Eigenschaft zu. Die__proto__
stellt dieprototype
dass diesefunction
basiert aus, und da dieses nur eine schlichteJavaScript function
ohneinheritance
noch einrichten, es bezieht sich auf dieObject prototype
das ist etwas, was nur gebaut, um JavaScript...https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/prototype
Dieser hat Dinge wie
.toString, .toValue, .hasOwnProperty
etc...__proto__
eingebracht wurde, mein mozilla ist veraltet und wird ersetzt durchObject.getPrototypeOf
Methode, um denobject's prototype
.Fügen wir eine Methode, um unsere
Tree
prototype
.Haben wir geändert, die
Root
und fügte hinzu, einefunction
Zweig.Das bedeutet, dass beim erstellen einer
instance
vonTree
Sie können es nennen, istbranch
Methode.Können wir auch
primitives
oderobjects
zu unsererPrototype
.Fügen wir eine
child-tree
zu unsererTree
.Hier die
Child
erbt seineprototype
aus Holz, was wir hier machen, ist mitObject.create()
- Methode ein neues Objekt zu erstellen, basierend auf, was Sie weitergeben, hier ist esTree.prototype
. In diesem Fall, was wir tun, ist die Einstellung der Prototyp von Kind an ein neues Objekt, dass aussieht wieTree
Prototyp. Als Nächstes setzen wir dieChild's constructor to Child
wenn wir es nicht tun würden, zeigen Sie aufTree()
.Child
hat nun seine eigeneprototype
seine__proto__
Punkte zuTree
undTree's prototype
Punkte auf BasisObject
.Nun erstellen Sie eine
instance
vonChild
- und call -branch
die ursprünglich inTree
. Wir haben nicht wirklich definiert unserebranch
auf dieChild prototype
. ABER, in derRoot prototype
welches Kind erbt von.In JS ist alles ein Objekt nicht, alles wirken kann wie ein Objekt.
Javascript
hat Grundelemente, wiestrings, number, booleans, undefined, null.
Sie sind nichtobject(i.e reference types)
aber kann sicherlich wirken wie eineobject
. Schauen wir uns hier ein Beispiel.In der ersten Zeile der Liste, ein
primitive
string-Wert zugewiesen wird, zu nennen. Die zweite Zeile behandelt Namen wie einobject
und fordertcharAt(0)
mithilfe der punktierten notation.Dies ist, was passiert hinter den kulissen:
//was die
JavaScript
Motor hatDen
String object
besteht nur aus einer Anweisung, bevor es zerstört wird (ein Prozess namensautoboxing
). Lasst uns wieder zurück zu unseremprototypal
inheritance
.Javascript
unterstützt die Vererbung überdelegation
basierend aufprototypes
.Function
hat eineprototype
Eigenschaft, die auf eine andere verweistObjekt.
properties/functions
sind schaute von derobject
selbst oder überprototype
Kette, wenn es nicht vorhanden istEinen
prototype
im JS wird ein Objekt, dasyields
Sie der Elternteil eines anderenobject
. [ie.. - delegation]Delegation
bedeutet, dass, wenn Sie nicht in der Lage sind, etwas zu tun, werden Sie sagen, jemand anderes zu tun es für Sie.https://jsfiddle.net/say0tzpL/1/
Wenn man sich das oben fiddle, der Hund hat Zugang zu
toString
Methode, die aber nicht verfügbar, sondern über die Prototyp-Kette, die Delegierten zuObject.prototype
Wenn Sie sich an der unten ein, wir werden versuchen, auf den
call
Methode, die verfügbar ist in jedemfunction
.https://jsfiddle.net/rknffckc/
Wenn man sich das oben fiddle,
Profile
Funktion hat Zugriff aufcall
Methode, die aber nicht verfügbar, sondern über die Prototyp-Kette, die Delegierten zuFunction.prototype
Hinweis:
prototype
ist eine Eigenschaft der function-Konstruktor, während__proto__
ist eine Eigenschaft der Objekte, die aus dem function-Konstruktor. Jede Funktion kommt mit einemprototype
Eigenschaft, deren Wert eine leereobject
. Wenn wir erstellen eine Instanz von der Funktion, erhalten wir eine interne Eigenschaft[[Prototype]]
oder__proto__
deren Referenz ist der Prototyp der Funktionconstructor
.Dem obigen Diagramm sieht etwas kompliziert aus, aber bringt das ganze Bild auf, wie
prototype chaining
funktioniert. Lassen Sie uns gehen durch diese langsam:Gibt es zwei Instanz
b1
undb2
dessen Konstruktor istBar
- und die Mutter ist " Foo " und hat zwei Methoden, die von der Prototypen-Ketteidentify
undspeak
überBar
undFoo
https://jsfiddle.net/kbp7jr7n/
Wenn man sich den code oben, wir haben
Foo
Konstruktor, der hat die Methodeidentify()
undBar
Konstruktor, der hatspeak
Methode. Wir erstellen zweiBar
Instanzb1
undb2
deren Eltern geben wirdFoo
. Jetzt, während die aufrufendespeak
Methode derBar
sind wir in der Lage, zu identifizieren, wer anruft, das sprechen überprototype
Kette.Bar
hat nun alle Methoden desFoo
sind definiert in seinerprototype
. Lasst uns weiter Graben im Verständnis derObject.prototype
undFunction.prototype
und wie Sie zusammenhängen. Wenn man sich den Konstruktor vonFoo
Bar
undObject
sindFunction constructor
.Den
prototype
vonBar
istFoo
prototype
vonFoo
istObject
und wenn Sie genau hinsehen, dieprototype
vonFoo
ist in Bezug aufObject.prototype
.Bevor wir schließen Sie diese unten, lassen Sie uns einfach wickeln mit einem kleinen Stück code hier zu alles zusammenzufassen, oben. Wir sind mit
instanceof
Betreiber hier, um zu überprüfen, ob eineobject
hat in seinerprototype
Kette derprototype
Eigenschaft einesconstructor
die unten fasst die gesamte big-Diagramm.Ich hoffe, dass diese fügen Sie einige Informationen, ich kenne das ein bisschen, könnte sein, groß zu fassen... in einfachen Worten seine es nur Objekte, die mit Objekten verknüpft sind!!!!
InformationsquelleAutor der Antwort Thalaivar
Die Schnittstelle zu standard-Klassen werden erweiterbar. Zum Beispiel, verwenden Sie die
Array
Klasse, und Sie müssen auch hinzufügen, um eine benutzerdefinierte serializer für alle array-Objekte. Würden Sie den Zeitaufwand für die Codierung eine Unterklasse, oder verwenden Zusammensetzung oder ... Die prototype-Eigenschaft löst dieses Problem, indem der Nutzer die Kontrolle über die exakte Menge von Elementen/Methoden zu einer Klasse.Denken von Prototypen als zusätzliche vtable-Zeiger. Wenn einige Mitglieder fehlen von der ursprünglichen Klasse, der Prototyp sah runtime.
InformationsquelleAutor der Antwort dirkgently
The Definitive Guide to Object-Oriented JavaScript - eine sehr prägnante und klare ~30min video-Erklärung, die die gestellte Frage (Prototypal Inheritance Thema beginnt von 5:45zwar höre ich mir lieber das ganze video). Der Autor dieses video-auch JavaScript-Objekt visualizer website http://www.objectplayground.com/.
InformationsquelleAutor der Antwort Bad
Fand ich es hilfreich zu erklären, die "prototype-chain" als rekursive Konvention, wenn
obj_n.prop_X
verwiesen wird:wenn
obj_n.prop_X
nicht vorhanden ist, überprüfen Sieobj_n+1.prop_X
woobj_n+1 = obj_n.[[prototype]]
Wenn die
prop_X
ist endlich gefunden, im k-TEN Prototyp-Objekt dannobj_1.prop_X = obj_1.[[prototype]].[[prototype]]..(k-times)..[[prototype]].prop_X
Finden Sie einen Graphen, der die Beziehung von Javascript-Objekten mit Ihren Eigenschaften hier:
http://jsobjects.org
InformationsquelleAutor der Antwort B M
Wenn ein Konstruktor erzeugt ein Objekt, wird das Objekt implizit Referenzen des Auftragnehmers ist "prototype" - Eigenschaft für die Zwecke der Sach-Referenzen. Der Konstruktor der "prototype" - Eigenschaft, auf die verwiesen werden kann, die durch das Programm expression Konstruktor.Prototyp und Eigenschaften zu einem Objekt Hinzugefügt Prototyp freigegeben sind, durch Vererbung, durch alle Objekte teilen den Prototyp.
InformationsquelleAutor der Antwort Tom
Lassen Sie mich Ihnen sagen, mein Verständnis von Prototypen. Ich werde nicht zu vergleichen, die Vererbung hier mit anderen Sprachen. Ich wünschte, die Leute würden aufhören zu vergleichen, Sprachen, und nur die Sprache versteht, als Sie selbst. Verständnis Prototypen und prototypal inheritance ist so einfach, wie ich zeigen werde, die Sie unter.
Prototyp ist wie ein Modell, auf dessen Grundlage Sie ein Produkt erzeugen. Der entscheidende Punkt zu verstehen ist, dass, wenn Sie erstellen ein Objekt mit einem anderen Objekt als Prototyp, der Verbindung zwischen dem Prototyp und das Produkt ewig. Zum Beispiel:
Jedes Objekt enthält eine interne Eigenschaft [[prototype]] zugegriffen werden kann, indem die
Object.getPrototypeOf()
Funktion.Object.create(model)
erzeugt ein neues Objekt und setzt es [[prototype]] - Eigenschaft auf das Objekt Modell. Daher, wenn Sie tunObject.getPrototypeOf(product)
erhalten Sie das Objekt Modell.Eigenschaften in der Produkt werden auf folgende Weise behandelt:
Solche Verknüpfung von Objekten über die prototype-Eigenschaft aufgerufen wird prototypal inheritance. Es ist so einfach, einverstanden?
InformationsquelleAutor der Antwort Aravind
Betrachten Sie die folgenden
keyValueStore
Objekt :Kann ich erstellen Sie eine neue Instanz von diesem Objekt zu tun :
Jede Instanz dieses Objekts würde die folgende öffentliche Eigenschaften :
data
get
set
delete
getLength
Nehmen wir nun an, wir erstellen 100 Instanzen dieser
keyValueStore
Objekt. Obwohlget
set
delete
getLength
wird genau die gleiche Sache für jede dieser 100 Instanzen, jede Instanz hat seine eigene Version dieser Funktion.Nun, sich vorstellen, wenn Sie konnte nur einen einzigen
get
set
delete
undgetLength
kopieren, und jede Instanz-Referenz, die gleiche Funktion. Das wäre besser für die Leistung und weniger Speicher benötigen.Das ist, wo die Prototypen kommen. Ein Prototyp ist ein "blueprint" von Eigenschaften, die vererbt wird, aber nicht kopiert von Instanzen. Das heißt also, es existiert nur einmal im Speicher für alle Instanzen eines Objekts und wird gemeinsam von allen dieser Instanzen.
Betrachten Sie nun die
keyValueStore
Objekt wieder. Könnte ich umschreiben es wie folgt :Diese tut GENAU das gleiche wie die Vorherige version des
keyValueStore
Objekt, mit der Ausnahme, dass alle seine Methoden sind jetzt in einem Prototyp. Was dies bedeutet, ist, dass alle 100 Instanzen teilen sich nun diese vier Methoden, anstatt jeweils eine eigene Kopie.InformationsquelleAutor der Antwort John Slegers
Anderen versuchen zu erklären, JavaScript-Prototyp-basierte Vererbung mit besseren Bildern
InformationsquelleAutor der Antwort rus1
Habe ich immer gerne Analogien, wenn es darum geht zu verstehen, diese Art von Sachen. 'Prototypische Vererbung' ist ziemlich unübersichtlich im Vergleich zu Klasse bass Vererbung meiner Meinung nach, obwohl die Prototypen sind viel einfacher Paradigma. In der Tat mit Prototypen, es gibt wirklich keine erbschaft, so ist der name an sich irreführend, es ist mehr eine Art von 'delegation'.
Vorstellen ....
Bist du in der high school, und Sie sind in der Klasse und haben ein quiz, die heute fällig, aber Sie haben nicht einen Stift, füllen Sie Ihre Antworten. Doh!
Sitzen Sie neben Ihrem Freund Finnius, die vielleicht einen Stift. Sie Fragen, und er sieht sich um seinen Schreibtisch erfolglos, aber anstatt zu sagen "ich habe keinen Stift", er ist ein netter Freund, den er prüft mit seinem anderen Freund Derp, wenn er einen Kugelschreiber. Derp hat in der Tat einen Ersatz-pen und übergibt Sie wieder an Finnius, wer leitet es über Ihnen zusammen, um Ihr quiz. Derp anvertraut hat, den Stift zu Finnius, wer delegiert hat den Stift, um Sie für den Einsatz.
Wichtig ist hier, dass die Derp ist nicht der Stift, um Sie, wie Sie nicht haben einen direkten Beziehung mit ihm.
Dies ist ein Vereinfachtes Beispiel, wie Prototypen arbeiten, wo ein Baum von Daten gesucht wird, das, was Sie suchen.
InformationsquelleAutor der Antwort Louis Moore
Gibt es zwei verschiedene, aber Verwandte Wesen hier, die, dass Notwendigkeit, zu erklären:
.prototype
Eigenschaft von Funktionen.[[Prototype]]
[1] - Eigenschaft aller Objekte[2].Diese sind zwei verschiedene Dinge.
Die
[[Prototype]]
Eigenschaft:Dies ist eine Eigenschaft, die vorhanden ist, auf alle[2] - Objekte.
Was hier gespeichert ist, ein anderes Objekt, das als Objekt selber hat eine
[[Prototype]]
seiner eigenen, die Punkte auf ein anderes Objekt. Das andere Objekt hat einen[[Prototype]]
seiner eigenen. Diese Geschichte wird fortgesetzt, bis Sie erreichen die prototypische Objekt stellt Methoden bereit, die den Zugriff auf alle Objekte (wie.toString
).Den
[[Prototype]]
Eigentum ist Teil von dem, was bildet die[[Prototype]]
Kette. Diese Kette von[[Prototype]]
Objekte ist, was wird überprüft, wenn beispielsweise[[Get]]
oder[[Set]]
Operationen durchgeführt werden, die auf ein Objekt:Die
.prototype
Eigenschaft:Dies ist eine Eigenschaft, die sich nur auf die Funktionen. Mit einer sehr einfachen Funktion:
Den
.prototype
Eigenschaft enthält ein Objekt zugewiesenb.[[Prototype]]
wenn Sievar b = new Bar
. Sie können ganz einfach prüfen:Einer der wichtigsten
.prototype
s ist, dass derObject
- Funktion. Dieser Prototyp enthält die prototypische Objekt, das alle[[Prototype]]
Ketten enthalten. Auf, alle verfügbaren Methoden für neue Objekte definiert:Nun, da
.prototype
ist ein Objekt, es hat einen[[Prototype]]
Eigenschaft. Wenn Sie es nicht schaffen, alle Aufgaben zuFunction.prototype
die.prototype
's[[Prototype]]
Punkte zu prototypisches Objekt (Object.prototype
). Dieser wird automatisch ausgeführt, wenn Sie erstellen Sie eine neue Funktion.Diese Weise, jedes mal, wenn Sie
new Bar;
die Prototyp-Kette für Sie eingerichtet, Sie bekommen alles, was definiertBar.prototype
und alles definiertObject.prototype
:Wenn Sie tun Zuweisungen zu
Function.prototype
alles, was Sie tun, ist die Erweiterung der Prototyp-Kette gehören zu einem anderen Objekt. Es ist wie ein einfügen in eine einfach verkettete Liste.Diese grundsätzlich verändert die
[[Prototype]]
Kette ermöglicht definierten Eigenschaften auf das Objekt zugewiesenFunction.prototype
gesehen werden von jedem Objekt erstellt die Funktion.[1: nicht verwechseln jedermann; über die
__proto__
Eigenschaft in vielen Implementierungen.[2]: Alle außer
null
.InformationsquelleAutor der Antwort Jim Fasarakis Hilliard
Seine nur, dass Sie bereits ein Objekt mit dem Objekt.neu, aber Sie haben noch nicht über ein Objekt, wenn Konstruktor-syntax.
InformationsquelleAutor der Antwort shiva kumar