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
var a = { name: "wendi" };
a.__proto__ === Object.prototype // true
Object.getPrototypeOf(a) === Object.prototype // true
function Foo() {};
var b = new Foo();
b.__proto__ === Foo.prototype
b.__proto__.__proto__ === Object.prototype
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 auf a
und speichert den Funktionscode auf als constructor
auf prototype
.
function Foo() {};
Foo.prototype // Object {constructor: function}
Foo.prototype.constructor === Foo // true
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()
werden Function.prototype.bind()
:Object.prototype.toString().
Warum die Eigenschaft einer Funktion hervorheben ?
{}.prototype // undefined;
(function(){}).prototype // Object {constructor: function}
// The example above shows object does not have the prototype property.
// But we have Object.prototype, which implies an interesting fact that
typeof Object === "function"
var obj = new Object();
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__
und prototype
?
__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:
function Foo() {}
var b = new Foo();
b.__proto__ === Foo.prototype // true
Foo.__proto__ === Function.prototype // true
Function.prototype.__proto__ === Object.prototype // true
__proto__
sich vonconstructor.prototype
?