首頁 >web前端 >js教程 >為什麼 JavaScript 中的原型陣列會在實例之間共用?

為什麼 JavaScript 中的原型陣列會在實例之間共用?

Linda Hamilton
Linda Hamilton原創
2024-11-23 02:19:10286瀏覽

Why Do Prototyped Arrays in JavaScript Become Shared Across Instances?

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 = [];
}

這裡,成分屬性被分配給每個新建立的實例,使其與其他實例不同並隔離。

共享資料與實例特定資料:

一般規則是在建構函式中分配特定於實例的數據,並在原型中分配共享資料(例如方法) 。這允許在創建物件時實現受控存取和靈活性。

附加說明:

  • 原型屬性透過指向原型物件的指標在內部引用。
  • 可以使用以下方式存取物件的原型Object.getPrototypeOf(obj).
  • 此行為是 JavaScript 中原型繼承所固有的,不適用於基於類別的語言。

以上是為什麼 JavaScript 中的原型陣列會在實例之間共用?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn