Wie unterscheidet sich __proto__ von constructor.prototype?
function Gadget(name, color)
{
this.name = name;
this.color = color;
}
Gadget.prototype.rating = 3
var newtoy = new Gadget("webcam", "black")
newtoy.constructor.prototype.constructor.prototype.constructor.prototype
Es gibt immer das Objekt mit dem rating = 3.
Aber wenn ich den folgenden Code:
newtoy.__proto__.__proto__.__proto__
Endet die Kette rauf wieder null
.
Auch im Internet Explorer wie kann ich das überprüfen der null-wenn es nicht ein __proto__
Eigenschaft?
InformationsquelleAutor der Frage xdevel2000 | 2009-03-16
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich habe versucht, einzuwickeln meinen Kopf, um dieses vor kurzem und kam schließlich mit dieser "Karte", dass ich meinen Schuppen voller Licht über die Materie
http://i.stack.imgur.com/KFzI3.png
Ich weiß, ich bin nicht der erste, der macht dies, aber es war mehr interessant, es herauszufinden, es zu finden :-). Wie auch immer, nachdem ich gefunden habe, z.B. ein anderes Diagramm, das denke ich sagt im Grunde das gleiche:
Javascript Objekt-layout
Die meisten überraschend für mich war die Entdeckung, dass
Object.__proto__
Punkte zuFunction.prototype
stattObject.prototype
aber ich bin sicher, es gibt einen guten Grund dafür 🙂Ich füge den code erwähnt in dem Bild hier, wenn jemand will, um es zu testen. Beachten Sie, dass einige Eigenschaften Hinzugefügt werden, um die Objekte zu machen, einfach zu wissen, wo wir nach einigen Sprüngen:
InformationsquelleAutor der Antwort drodsou
constructor
ist eine vordefinierte [[DontEnum]] - Eigenschaft des Objekts gezeigt, durch denprototype
Eigenschaft einer Funktion ein Objekt und wird zunächst zeigen Sie auf die Funktion Objekt selbst.__proto__
entspricht dem internen [[Prototype]] - Eigenschaft eines Objekts, dh seine eigentliche Prototyp.Wenn Sie ein Objekt erstellen, das mit der
new
Betreiber, seine internen [[Prototype]] - Eigenschaft wird festgelegt, um das Objekt wies auf die von der Konstruktorfunktionprototype
Eigenschaft.Dies bedeutet, dass
.constructor
bewerten zu.__proto__.constructor
D. H. der Konstruktor-Funktion verwendet, um das Objekt zu erstellen, und wie wir gelernt haben, dieprotoype
Eigenschaft dieser Funktion wurde verwendet, um das Objekt [[Prototype]].Daraus folgt, dass
.constructor.prototype.constructor
ist identisch mit.constructor
(solange diese Eigenschaften noch nicht überschrieben worden sind); siehe hier für eine ausführlichere Erklärung.Wenn
__proto__
verfügbar ist, können Sie zu Fuß die tatsächlichen Prototypkette des Objekts. Es gibt keine Möglichkeit, dies zu tun in plain ECMAScript3, weil JavaScript nicht für die Tiefe Vererbung Hierarchien.InformationsquelleAutor der Antwort Christoph
Den Prototypal Inheritance in JavaScript basiert auf
__proto__
Eigenschaft in dem Sinne, dass jedes Objekt erbt der Inhalt des referenzierten Objekts durch seine__proto__
Eigenschaft.Den
prototype
Eigenschaft ist speziell nur fürFunction
Objekte und nur bei Verwendung vonnew
operator zum aufrufen einerFunction
als Konstruktor. In diesem Fall wird das erstellte Objekt__proto__
wird KonstruktorFunction.prototype
.Dies bedeutet, dass das hinzufügen, um
Function.prototype
automatisch spiegeln sich auf alle Objekte aus, deren__proto__
auf dieFunction.prototype
.Ersetzen Konstruktor
Function.prototype
mit einem anderen Objekt wird nicht update__proto__
Eigenschaft für alle bereits vorhandenen Objekte.Beachten Sie, dass
__proto__
Eigenschaft sollte nicht direkt zugegriffen werden, Objekt.getPrototypeOf(object) sollte stattdessen verwendet werden.Zur Beantwortung der ersten Frage, ich habe eine maßgeschneiderte Diagramm
__proto__
undprototype
Referenzen, leider stackoverflow nicht erlauben, mich zu fügen Sie das Bild mit "weniger als 10 Ruf". Vielleicht ein anderes mal.[Bearbeiten]
Die Abbildung verwendet
[[Prototype]]
statt__proto__
denn das ist, wie ECMAScript-Spezifikation bezieht sich auf interne Objekte. Ich hoffe, Sie können herausfinden alles aus.Hier sind einige Hinweise, die Ihnen helfen zu verstehen, die Abbildung:
Beachten Sie, dass
constructor
Eigenschaft existiert nicht in der Objekte angelegt, sondern wird vererbt vom Prototypen.InformationsquelleAutor der Antwort xorcus
Object
ist Eva, undFunction
ist Adam, Adam (Function
) nutzt seine Knochen (Function.prototype
) zu erstellen, Eva (Object
). Dann erschuf Adam (Function
)? -- Der Erfinder der JavaScript-Sprache :-).Laut utsaina s Antwort möchte ich noch hinzufügen weitere nützliche Infos.
Sollte es NICHT sein.
Object.__proto__
sollte NICHT zuObject.prototype
. Stattdessen wird die Instanz vonObject
o
o.__proto__
zeigen sollte, zuObject.prototype
.(Verzeihen Sie mir die Verwendung der Begriffe
class
undinstance
in JavaScript, aber Sie wissen es 🙂Ich denke, die Klasse
Object
selbst ist eine Instanz vonFunction
das ist, warumObject.__proto__ === Function.prototype
. Daher:Object
ist Eva, undFunction
ist Adam, Adam (Function
) nutzt seine Knochen (Function.prototype
) zu erstellen, Eva (Object
).Darüber hinaus auch die Klasse
Function
selbst ist eine Instanz vonFunction
selbst, das istFunction.__proto__ === Function.prototype
das ist auch der Grund, warumFunction === Function.constructor
Weiter darüber hinaus die reguläre Klasse
Cat
ist eine Instanz vonFunction
das istCat.__proto__ === Function.prototype
.Der Grund für die oben genannten ist, wenn wir es schaffen, eine Klasse in JavaScript, tatsächlich, wir erstellen eine Funktion, die eine Instanz von
Function
.Object
undFunction
sind nur Besondere, aber Sie sind immer noch Klassen, währendCat
ist eine reguläre Klasse.Als eine Angelegenheit der Faktor, in Google Chrome JavaScript-engine, die folgenden 4:
Function.prototype
Function.__proto__
Object.__proto__
Cat.__proto__
Sind Sie alle
===
(absolut gleich) zu den anderen 3, und Ihr Wert istfunction Empty() {}
OK. Wer dann schafft die speziellen
function Empty() {}
(Function.prototype
)? Denken Sie daran 🙂InformationsquelleAutor der Antwort Peter Lee
Ich weiß wirklich nicht, warum die Leute nicht korrekt um, wo das eigentliche problem im Verständnis.
Damit wäre viel einfacher für Sie, um vor Ort das problem
Also lasst uns sehen, was Los ist :
Toll , so jetzt schauen wir uns diese
__proto__
Vorher bitte vergessen Sie 2 Dinge in Bezug auf
__proto__
:Wenn Sie ein Objekt erstellen, das mit der
new
Betreiber, seine internen[[Prototype]]
/proto__
Eigenschaft wird festgelegt, um dieprototype
Eigenschaft(1) von seinerconstructor function
oder "Schöpfer", wenn Sie möchten .Hart codiert in JS — :
Object.prototype.__proto__
istnull
.Let ' s finden Sie diese 2 Punkte als "
bill
"Besser?
InformationsquelleAutor der Antwort Royi Namir
Alle Funktionen erstellt Prototypen.
Und wenn wir ein Objekt erstellen, das über das function-Konstruktor dann die __proto__ Eigentum von meinem Objekt zeigen, um den Prototypen der Funktion.
InformationsquelleAutor der Antwort Apoorv Nag
Wenn alle diese zahlen waren überwältigend, lassen Sie uns nehmen einen Blick, was die Eigenschaften bedeuten.
STH.prototype
Beim erstellen einer neuen Funktion, es wird ein leeres Objekt erzeugt wird, in parallele und Zusammenhang mit der Funktion mit
[[Prototype]]
Kette. Der Zugriff auf dieses Objekt verwenden wirprototype
Eigenschaft der Funktion.Beachten Sie, dass
prototype
Eigenschaft ist nur für Veranstaltungen zur Verfügung.STH.Konstruktor
Prototyp-Objekt oben erwähnt hat keine Eigenschaften, außer einer -
constructor
. Diese Eigenschaft repräsentiert eine Funktion, schuf den Prototyp-Objekt.Beim erstellen
Gadget
Funktion, erstellten wir ein Objekt wie{constructor: Gadget}
wie gut, dass ist nichts, wieGadget.prototype
. Alsconstructor
bezieht sich auf eine Funktion, die ein Objekt erstellt Prototypen,toy.constructor
stelltGadget
Funktion. Wir schreibentoy.constructor.prototype
und wir sind immer{constructor: Gadget}
wieder.Daher, es ist ein Teufelskreis: Sie können
toy.constructor.prototype.constructor.prototype.constructor.prototype.constructor.prototype.constructor.prototype.constructor.prototype.constructor.prototype.constructor.prototype
- und er wird es immer seinGadget.prototype
.STH.__proto__
Während
prototype
ist eine Eigenschaft, die spezifisch für Funktionen__proto__
ist für alle Objekte verfügbar, da legt es inObject.prototype
. Es bezieht sich auf den Prototyp einer Funktion, die ein Objekt erstellen.Hier
toy.__proto__
istGadget.prototype
. AlsGadget.prototype
ist ein Objekt ({}
) und Objekte erstellt werden, mitObject
- Funktion (siehe Beispiel oben), bekommen wirObject.prototype
. Dies ist den höheren Objekt in JavaScript und seinen__proto__
kann nur zeigennull
.InformationsquelleAutor der Antwort Damian Czapiewski