Prototyp-Sharing in JavaScript verstehen: Von Prototypen geerbte Objekte
In JavaScript erben Objekte Eigenschaften von ihren Prototypen. Ein zu berücksichtigender Aspekt ist, wie sich Arrays, die als Prototypeigenschaften definiert sind, innerhalb von Klasseninstanzen verhalten.
Wie beobachtet, sind prototypische Arrays nicht für einzelne Klasseninstanzen privat, sondern werden stattdessen von allen Instanzen gemeinsam genutzt. Dieses Verhalten entsteht, weil der Prototyp eines Objekts selbst als Objekt fungiert. Prototypeigenschaften werden von allen von diesem spezifischen Prototyp abgeleiteten Objekten gemeinsam genutzt.
Betrachten Sie das folgende Beispiel:
function Sandwich() { // Uncomment this to fix the problem //this.ingredients = []; } Sandwich.prototype = { "ingredients" : [], "addIngredients" : function( ingArray ) { for( var key in ingArray ) { this.addIngredient( ingArray[ key ] ); } }, "addIngredient" : function( thing ) { this.ingredients.push( thing ); } }
In diesem Beispiel wird ein Array mit dem Namen „ingredients“ als Prototypeigenschaft von definiert die „Sandwich“-Funktion. Wenn „this.ingredients = [];“ innerhalb des Konstruktors auskommentiert ist, tritt das folgende Verhalten auf:
Wenn eine neue Instanz von „Sandwich“ erstellt wird (z. B. „Cheeseburger“ oder „blt“), erben diese Instanzen zunächst das Array „ingredients“ von der Prototyp. An diesem Array vorgenommene Änderungen, wie etwa das Hinzufügen von Zutaten zu „Cheeseburger“, wirken sich auch auf die „Zutaten“-Arrays aller anderen „Sandwich“-Instanzen aus. Dieses gemeinsame Verhalten ergibt sich aus der Tatsache, dass alle Instanzen auf dasselbe Array verweisen und nicht auf einzelne Kopien.
Um dieses Problem zu beheben und für jede Instanz ein separates Array zu erstellen, muss das Array „Zutaten“ im Konstruktor definiert werden:
function Sandwich() { this.ingredients = []; }
Diese Änderung weist jeder Instanz von „Sandwich“ während der Erstellung ein neues Array zu und stellt so sicher, dass alle am Array „Zutaten“ vorgenommenen Änderungen wirksam werden instanzspezifisch.
Zusammenfassend lässt sich sagen, dass als Prototypeigenschaften definierte Arrays von allen Objekten gemeinsam genutzt werden, die von diesem Prototyp erben. Um instanzspezifische Daten wie Arrays zu erstellen, müssen diese im Konstruktor definiert werden. Dieses Verständnis ist entscheidend für den effektiven Einsatz von Vererbung und objektorientierter Programmierung in JavaScript.
Das obige ist der detaillierte Inhalt vonWarum werden Prototyp-Arrays in JavaScript von Klasseninstanzen gemeinsam genutzt?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!