In JavaScript können Objekteigenschaften auf zwei Arten definiert werden: direkt am Objekt oder als Eigenschaften des Prototyp des Objekts. Dieses Verhalten hat erhebliche Auswirkungen auf den Umgang mit Arrays.
Standardmäßig werden prototypische Arrays von allen Instanzen einer Klasse gemeinsam genutzt, was zu unerwartetem Verhalten führt. Wenn beispielsweise der Prototyp einer Klasse ein leeres Array enthält, verweisen alle Instanzen auf dasselbe Array. Dies kann im folgenden Beispiel beobachtet werden:
function Sandwich() { // Uncomment 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); } }; var cheeseburger = new Sandwich(); cheeseburger.addIngredients(["burger", "cheese"]); var blt = new Sandwich(); blt.addIngredients(["bacon", "lettuce", "tomato"]); print_r("Cheeseburger contains:", cheeseburger.ingredients);
In diesem Beispiel haben sowohl Cheeseburger als auch Blt dasselbe Zutatenarray, obwohl es sich um unterschiedliche Instanzen handelt. Das Hinzufügen einer Zutat zum Cheeseburger wirkt sich auch auf BLT aus und unterstreicht die gemeinsame Natur des Arrays.
Um dieses Verhalten zu beheben, wird empfohlen, Arrays direkt am Objekt selbst und nicht als Prototypeigenschaften zu definieren. Dadurch wird sichergestellt, dass jede Instanz über ein eigenes privates Array verfügt. Die folgende Änderung am Code behebt das Problem:
function Sandwich() { this.ingredients = []; }
Durch die Definition des Arrays im Konstruktor verfügt jede Instanz von Sandwich über eine eigene private Kopie des Arrays, wodurch das Freigabeverhalten entfällt.
Zusammenfassend lässt sich sagen, dass prototypische Arrays von allen Instanzen einer Klasse in JavaScript gemeinsam genutzt werden. Um für jede Instanz private Arrays zu erstellen, ist es notwendig, das Array direkt am Objekt selbst im Konstruktor zu definieren. Diese Unterscheidung ist entscheidend für das Verständnis und die Verwaltung des Objektverhaltens in JavaScript.
Das obige ist der detaillierte Inhalt vonWerden JavaScript-Objektmitglieder als freigegebene oder private Arrays prototypisiert?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!