Heim >Web-Frontend >js-Tutorial >Warum wird die Eigenschaft „constructor' von JavaScript während der prototypischen Vererbung nicht aktualisiert?

Warum wird die Eigenschaft „constructor' von JavaScript während der prototypischen Vererbung nicht aktualisiert?

Barbara Streisand
Barbara StreisandOriginal
2024-12-01 05:05:17619Durchsuche

Why Doesn't JavaScript's `constructor` Property Update During Prototypal Inheritance?

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:

  • Beim Erstellen einer Funktion wie function Foo() {} erstellt JavaScript intern eine Funktionsinstanz (den Konstruktor). Funktion).
  • Jede Konstruktorfunktion verfügt über eine Prototypeigenschaft, die ein Zeiger auf ihr Prototypobjekt ist.
  • Das Prototypobjekt verfügt über eine Konstruktoreigenschaft, die auf ihre Konstruktorfunktion zurückzeigt.
  • Beim Erstellen einer neuen Instanz von Foo mit new Foo() wird ein neues Objekt erstellt und seine interne [[proto]]-Eigenschaft zeigt auf den Prototyp des Konstruktor.

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:

  • Logische Korrektheit: Zum Beispiel Object.prototype.constructor zeigt auf Objekt. Wenn es auf der Instanz definiert wäre, wäre es für Object.prototype undefiniert, da es eine Instanz von null ist.
  • Konsistenz mit anderen Prototypmethoden: Dies vereinfacht die Implementierung von new, die nicht definiert werden muss die Konstruktor-Eigenschaft für jede Instanz.
  • Effizienz: Alle Instanzen nutzen die gleiche Konstruktor-Eigenschaft, wodurch der Speicher reduziert wird Overhead.

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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn