JavaScript-Vererbung: Die Konstruktoreigenschaft verstehen
Frage:
Bedenken Sie den Code:
function a() {} function b() {} function c() {} b.prototype = new a(); c.prototype = new b(); console.log((new a()).constructor); //a() console.log((new b()).constructor); //a() console.log((new c()).constructor); //a()
Warum wird die Konstruktoreigenschaft für b nicht aktualisiert? und c, obwohl ihr Prototyp so eingestellt ist, dass er von a erbt?
Antwort:
Um dies zu verstehen, begeben wir uns auf eine konzeptionelle Reise:
Nun stellt sich die Frage: Warum ist die Konstruktoreigenschaft nicht auf dem Instanzobjekt selbst definiert? Betrachten Sie das folgende Beispiel:
function defclass(prototype) { var constructor = prototype.constructor; constructor.prototype = prototype; return constructor; } var Square = defclass({ constructor: function (side) { this.side = side; }, area: function () { return this.side * this.side; } }); var square = new Square(10); console.log(square.area()); // 100
In diesem Beispiel ist die Konstruktoreigenschaft eine Methode des Prototyps wie jede andere. Es wird jedoch speziell zum Initialisieren von Instanzen des Prototyps verwendet.
Das Definieren der Konstruktoreigenschaft am Prototyp bietet mehrere Vorteile:
Vererbung und die Konstruktoreigenschaft
Bei der Vererbung wird die Prototypeigenschaft des abgeleiteten Konstruktors auf eine Instanz des Basiskonstruktors gesetzt . Folglich verweist die interne [[proto]]-Eigenschaft der abgeleiteten Konstruktorinstanz auch auf den Prototyp des Basiskonstruktors. Dies führt dazu, dass die Konstruktoreigenschaft der abgeleiteten Konstruktorinstanz auf den Basiskonstruktor verweist.
Der „Instanceof“-Operator
Der „Instanceof“-Operator arbeitet mit einem Instanzobjekt und einer Konstruktorfunktion. Entgegen der landläufigen Meinung ist es nicht auf die Konstruktoreigenschaft der Instanz angewiesen. Stattdessen durchläuft es die Prototypenkette der Instanz und prüft, ob ihre interne [[proto]]-Eigenschaft mit der Prototypeneigenschaft des Konstruktors übereinstimmt. Eine Übereinstimmung gibt „true“ zurück, während ein Ende der Prototypenkette „false“ zurückgibt.
Das obige ist der detaillierte Inhalt vonWarum wird die Eigenschaft „constructor' von JavaScript während der prototypischen Vererbung nicht aktualisiert?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!