Prototypen
JavaScript ist eine prototypbasierte Sprache. Daher ist das Verständnis des Prototypobjekts eines der wichtigsten Konzepte, die JavaScript-Anwender kennen müssen. Dieser Artikel gibt Ihnen anhand verschiedener Beispiele einen kurzen Überblick über das Prototype-Objekt. Bevor Sie diesen Artikel lesen, müssen Sie ein grundlegendes Verständnis der this
Referenz in JavaScript haben.
Prototypobjekt
Lassen Sie uns der Klarheit halber das folgende Beispiel untersuchen:
function Point2D(x, y) { this.x = x; this.y = y; }
Wenn die Point2D
Funktion deklariert wird, wird eine Standardeigenschaft mit dem Namen prototype
dafür erstellt (beachten Sie, dass in JavaScript eine Funktion auch ein Objekt ist). Die prototype
Eigenschaft ist ein Objekt, das eine constructor
Eigenschaft enthält und deren Wert die Point2D
Funktion ist : Point2D.prototype.constructor = Point2D
. Wenn Sie Point2D
mit einem new
Schlüsselwort aufrufen , erben neu erstellte Objekte alle Eigenschaften vonPoint2D.prototype
. Um zu überprüfen , dass, können Sie eine Methode hinzufügen , benannt move
in Point2D.prototype
wie folgt:
Point2D.prototype.move = function(dx, dy) { this.x += dx; this.y += dy; } var p1 = new Point2D(1, 2); p1.move(3, 4); console.log(p1.x); // 4 console.log(p1.y); // 6
Das Point2D.prototype
wird als Prototypobjekt oder Prototyp eines p1
Objekts und für jedes andere mit new Point2D(...)
Syntax erstellte Objekt bezeichnet . Sie können dem Point2D.prototype
Objekt nach Belieben weitere Eigenschaften hinzufügen . Das übliche Muster ist, Methoden zu deklarieren Point2D.prototype
und andere Eigenschaften in der Konstruktorfunktion zu deklarieren.
Integrierte Objekte in JavaScript werden auf ähnliche Weise erstellt. Zum Beispiel:
- Prototyp von Objekten, die mit
new Object()
oder{}
Syntax erstellt wurden, istObject.prototype
. - Prototyp von Arrays, die mit
new Array()
oder[]
Syntax erstellt wurden, istArray.prototype
. - Und so weiter mit anderen eingebauten Objekten wie
Date
undRegExp
.
Object.prototype
wird von allen Objekten geerbt und hat keinen Prototyp (sein Prototyp ist null
).
Prototypkette
Der Prototyp-Kettenmechanismus ist einfach: Wenn Sie auf eine Eigenschaft p
für ein Objekt obj
zugreifen, durchsucht die JavaScript-Engine diese Eigenschaft innerhalb eines obj
Objekts. Wenn die Engine nicht sucht, setzt sie die Suche im Prototyp des obj
Objekts usw. bis zum Erreichen fort Object.prototype
. Wenn nach Abschluss der Suche nichts gefunden wurde, wird das Ergebnis angezeigt undefined
. Zum Beispiel:
var obj1 = { a: 1, b: 2 }; var obj2 = Object.create(obj1); obj2.a = 2; console.log(obj2.a); // 2 console.log(obj2.b); // 2 console.log(obj2.c); // undefined
Im obigen Snippet erstellt die Anweisung var obj2 = Object.create(obj1)
ein obj2
Objekt mit einem Prototypobjekt obj1
. Mit anderen Worten, obj1
wird zum Prototyp von obj2
statt Object.prototype
standardmäßig. Wie Sie sehen, b
ist keine Eigenschaft von obj2
, Sie können dennoch über die Prototypenkette darauf zugreifen. Für c
Immobilien erhalten Sie jedoch einen undefined
Wert, da dieser nicht in obj1
und gefunden werden kann Object.prototype
.
Klassen
In ES2016 können wir nun das Class
Schlüsselwort sowie die oben genannten Methoden zum Bearbeiten verwenden prototype
. Das JavaScript Class
spricht Entwickler mit OOP-Hintergrund an, macht aber im Wesentlichen dasselbe wie oben.
class Rectangle { constructor(height, width) { this.height = height this.width = width } get area() { return this.calcArea() } calcArea() { return this.height * this.width } } const square = new Rectangle(10, 10) console.log(square.area) // 100
Dies ist im Grunde das gleiche wie:
function Rectangle(height, width) { this.height = height this.width = width } Rectangle.prototype.calcArea = function calcArea() { return this.height * this.width }
Die Methoden getter
und setter
in Klassen binden eine Object-Eigenschaft an eine Funktion, die beim Nachschlagen dieser Eigenschaft aufgerufen wird. Es ist nur syntaktischer Zucker, um das Nachschlagen oder Festlegen von Eigenschaften zu erleichtern .
Weitere Informationen zu JS-Prototypen:
- Alles, was Sie wissen müssen, um den Prototyp von JavaScript zu verstehen