JavaScript 中的原型陣列:跨實例共享
在 JavaScript 中,原型可以在類別的實例之間共享行為和資料。然而,當對陣列進行原型設計時,會出現一種獨特的行為:它們在所有類別實例之間共享,而不是私有。
原型設計的工作原理:
物件作為創建新物件的藍圖。原型中定義的屬性和方法可由繼承它的所有物件存取。這個概念不同於基於類別的語言,在基於類別的語言中,實例具有單獨的屬性副本。
在以下範例中,Sandwich 類別繼承自 Sandwich.prototype 物件:
function Sandwich() { // Uncomment to fix the problem //this.ingredients = []; } Sandwich.prototype = { "ingredients" : [], // ... };
這裡,成分屬性在原型上定義。這意味著所有實例(例如,cheeseburger、blt 等)都將共用同一個陣列。
共享陣列:
原型陣列的問題是修改一個陣列實例的陣列會影響所有其他實例。正如問題中提供的範例所示,這可能會導致意外行為。當修改cheeseburger.ingredients或blt.ingredients時,它會更改從Sandwich.prototype繼承的相同共用陣列。
如何避免共享:
建立私人每個實例的數組,在建構子中定義屬性,而不是原型:
function Sandwich() { this.ingredients = []; }
這裡,成分屬性被分配給每個新建立的實例,使其與其他實例不同並隔離。
共享資料與實例特定資料:
一般規則是在建構函式中分配特定於實例的數據,並在原型中分配共享資料(例如方法) 。這允許在創建物件時實現受控存取和靈活性。
附加說明:
以上是為什麼 JavaScript 中的原型陣列會在實例之間共用?的詳細內容。更多資訊請關注PHP中文網其他相關文章!