在 JavaScript 中,物件屬性可以透過兩種方式定義:直接在物件上定義或作為物件的屬性物件的原型。在處理數組時,此行為具有重大影響。
預設情況下,原型數組在類別的所有實例之間共享,從而導致意外行為。例如,如果一個類別的原型包含一個空數組,則所有實例都將引用同一個數組。這可以在以下範例中觀察到:
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);
在此範例中,cheeseburger 和 blt 共享相同的成分數組,即使它們是不同的實例。在起司漢堡中添加成分也會影響 blt,突顯陣列的共享性質。
要修正此行為,建議直接在物件本身上定義數組,而不是作為原型屬性。這確保每個實例都有自己的私有數組。對程式碼進行以下修改可以解決問題:
function Sandwich() { this.ingredients = []; }
透過在建構函式中定義數組,Sandwich 的每個實例都將擁有自己的數組私有副本,從而消除共享行為。
總之,原型陣列在 JavaScript 中類別的所有實例之間共用。要為每個實例建立私有數組,需要在建構函數中直接在物件本身上定義數組。這種區別對於理解和管理 JavaScript 中的物件行為至關重要。
以上是JavaScript 物件成員的原型是共享陣列還是私有陣列?的詳細內容。更多資訊請關注PHP中文網其他相關文章!