」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > 為什麼原型化為陣列的 JavaScript 物件成員在類別實例之間共用?

為什麼原型化為陣列的 JavaScript 物件成員在類別實例之間共用?

發佈於2024-12-22
瀏覽:115

Why do JavaScript Object Members Prototyped as Arrays Become Shared Across Class Instances?

原型化為陣列的JavaScript 物件成員:跨類別實例共享

在JavaScript 中對陣列進行原型設計時,了解這些成員是共享的至關重要在所有類別實例中。如果您習慣了私有物件成員,這種行為可能看起來違反直覺。

行為解釋

JavaScript的原型機制允許物件從父物件繼承屬性和方法,稱為原型。當您將陣列定義為原型中的屬性時,從該原型繼承的所有物件都可以存取它。

範例腳本示範了此行為:

function Sandwich() {
    // Uncomment this to fix the problem
    //this.ingredients = [];
}

如果取消註解行,每個 Sandwich 實例都會有自己的私有成分陣列。然而,當該行被註解掉後,所有實例共享相同的原型數組。

這意味著在cheesburger添加成分也會更新blt和spicy_chicken_sandwich的成分。為了防止這種情況,您必須在建構函式中定義成分數組,如下面更新的範例所示:

function Sandwich() {
    this.ingredients = [];
}

原型與實例

區分原型屬性和實例屬性至關重要。原型屬性由從該原型繼承的所有物件共享,而實例屬性對於每個物件都是唯一的。

  • 將屬性指派給原型以定義共享資料或方法。
  • 指派建構函式內實例的屬性以定義特定於實例的資料。

程式碼修改以修復Behaviour

在範例腳本中,取消註解行this.ingredients = []; Sandwich 建構函數中確保每個實例都按預期擁有自己的成分數組。

結論

了解 JavaScript 中原型陣列的行為對於避免意外共享至關重要類別實例之間。永遠記住,應該是特定於實例的資料應該在建構函式中定義,而共享資料可以透過繼承來分配給原型。

最新教學 更多>
  • 在 Go 中使用 WebSocket 進行即時通信
    在 Go 中使用 WebSocket 進行即時通信
    构建需要实时更新的应用程序(例如聊天应用程序、实时通知或协作工具)需要一种比传统 HTTP 更快、更具交互性的通信方法。这就是 WebSockets 发挥作用的地方!今天,我们将探讨如何在 Go 中使用 WebSocket,以便您可以向应用程序添加实时功能。 在这篇文章中,我们将介绍: WebSoc...
    程式設計 發佈於2024-12-22
  • 如何修復 MySQL 連線錯誤 (2000):mysqlnd 無法使用舊式驗證進行連線?
    如何修復 MySQL 連線錯誤 (2000):mysqlnd 無法使用舊式驗證進行連線?
    克服「連線錯誤(2000):mysqlnd無法使用舊式驗證連接到MySQL 4.1」障礙連接到MySQL資料庫舊的身份驗證方案可能會觸發「連線錯誤(2000)」錯誤。要解決此問題,請考慮以下步驟:1.評估伺服器密碼架構運行SQL 查詢「SHOW VARIABLES LIKE 'old_pas...
    程式設計 發佈於2024-12-22
  • 如何在 PHP 中使用 Glob() 按副檔名高效過濾文件
    如何在 PHP 中使用 Glob() 按副檔名高效過濾文件
    使用 PHP 按副檔名有效率地過濾檔案使用 scandir() 函式從 PHP 目錄擷取檔案清單非常簡單。然而,當您需要根據特定副檔名(例如 .ini)過濾掉檔案時,有效的方法至關重要。 PHP 中的 glob() 函數為此類過濾提供了最佳化的解決方案。它接受一個模式作為參數並傳回與該模式相符的路徑...
    程式設計 發佈於2024-12-22
  • 為什麼 C++ 會拋出「類別不存在預設建構函式」錯誤,以及如何修復它?
    為什麼 C++ 會拋出「類別不存在預設建構函式」錯誤,以及如何修復它?
    理解C 中的「類別不存在預設建構子」錯誤在C 中進行物件導向程式設計時,遇到與預設建構子相關的錯誤並不罕見。本綜合指南將幫助您理解並解決「類別不存在預設建構子」問題。 問題描述嘗試實例化時出現「類別不存在預設建構子」錯誤類別的對象,而不向其建構子提供必要的參數。預設建構函數是一個特殊的成員函數,當未...
    程式設計 發佈於2024-12-22
  • 為什麼 GCC 4.6.1 難以處理 std::array 的初始化清單?
    為什麼 GCC 4.6.1 難以處理 std::array 的初始化清單?
    在 std::array 中使用初始化清單可以透過多種方式使用初始化清單建立 std::array。然而,GCC 4.6.1 嘗試此操作時可能會遇到錯誤。 初始化語法使用初始化清單建立std::array 的語法為:std::array<T, size> array = { { valu...
    程式設計 發佈於2024-12-22
  • 如何在 ASP.NET UpdatePanel 中可靠地處理 jQuery 事件?
    如何在 ASP.NET UpdatePanel 中可靠地處理 jQuery 事件?
    使用jQuery 的$(document).ready 處理UpdatePanel 中的事件使用jQuery 處理UpdatePanel 中的元素時,僅依賴$ ( document).ready 事件綁定可能還不夠。部分頁面更新後,這些事件處理程序將不再在更新區域內執行。 推薦方法要解決此問題,請考...
    程式設計 發佈於2024-12-22
  • 為什麼 `console.log(element.children)` 最初顯示長度為 0,但擴充後顯示為 3 條?
    為什麼 `console.log(element.children)` 最初顯示長度為 0,但擴充後顯示為 3 條?
    element.children的Console.log顯示0長度,但稍後展開時有3個條目程式設計中,了解物件的狀態至關重要。使用 console.log 檢查元素時,了解它如何顯示物件非常重要。 console.log 根據物件的目前狀態動態更新其顯示。最初,當您記錄元素的子元素 (element...
    程式設計 發佈於2024-12-22
  • 如何將 jQuery UI Sortable 與資料庫整合以維持順序?
    如何將 jQuery UI Sortable 與資料庫整合以維持順序?
    jQuery UI Sortable 和資料庫整合使用 jQuery UI Sortable,您可以讓使用者重新排列元素並保持特定的順序。若要將此功能與資料庫集成,您可以結合使用序列化方法和 AJAX 或表單提交。 $('#sortable').sortable({ axis: 'y', ...
    程式設計 發佈於2024-12-22
  • 大批
    大批
    方法是可以在物件上呼叫的 fns 數組是對象,因此它們在 JS 中也有方法。 slice(begin):將陣列的一部分提取到新數組中,而不改變原始數組。 let arr = ['a','b','c','d','e']; // Usecase: Extract till index ...
    程式設計 發佈於2024-12-22
  • 為什麼影像標籤中的影像顯示為上下顛倒?
    為什麼影像標籤中的影像顯示為上下顛倒?
    圖像標籤中的圖像方向差異使用圖像標籤將圖像合併到網頁中時,圖像的方向應保持一致以其原始狀態。但在某些場景下,影像在影像標籤中顯示後可能會出現上下顛倒或傾斜的情況。為了解決這個問題,我們將探討潛在的原因並提供解決方案。 提供的範例示範了一個圖像,該圖像在網頁瀏覽器中正確顯示,但在分配給圖像標籤的 sr...
    程式設計 發佈於2024-12-22
  • JavaScript 最佳實務:編寫高效且最佳化的程式碼
    JavaScript 最佳實務:編寫高效且最佳化的程式碼
    JavaScript 最佳实践和代码优化 JavaScript 是一种通用且广泛使用的语言,但编写高效且可维护的代码需要遵守最佳实践和优化技术。通过遵循这些准则,您可以确保您的 JavaScript 应用程序高性能、可扩展且更易于调试。 1.使用 let 和 con...
    程式設計 發佈於2024-12-22
  • 如何在沒有內建函數的情況下在 JavaScript 中將顏色名稱轉換為十六進位程式碼?
    如何在沒有內建函數的情況下在 JavaScript 中將顏色名稱轉換為十六進位程式碼?
    如何在Javascript 中將顏色名稱轉換為十六進位代碼顏色轉換可能是一項繁瑣的任務,特別是如果您需要手動編碼每個可能的組合。幸運的是,有一些方法可以簡化這個過程並節省一些時間。 內建函數儘管Javascript 具有廣泛的功能,但它本身並不提供內建函數in 函數可以直接將顏色名稱轉換為其十六進位...
    程式設計 發佈於2024-12-22
  • 如何使用 PDFBox 將 PDF 檔案轉換為影像?
    如何使用 PDFBox 將 PDF 檔案轉換為影像?
    使用PDFBox將PDF文件轉換為圖像簡介PDFBox是一個流行的開放式-用於處理PDF 文件的來源Java 庫。 PDFBox 具有眾多功能,其中包括允許開發人員將 PDF 文件轉換為圖像,從而方便將各個頁面提取為圖像格式。本教學將引導您完成使用 PDFBox 實現此轉換的過程。 轉換範例程式碼P...
    程式設計 發佈於2024-12-22
  • 為什麼 Go 的「pprof」和 Docker 統計報告的記憶體使用情況不同?
    為什麼 Go 的「pprof」和 Docker 統計報告的記憶體使用情況不同?
    Go Tool Pprof 和Docker Stats 之間的記憶體使用差異使用Go 1.11 時,您可能會遇到Go 報告的記憶體使用情況存在差異工具pprof (runtime.MemStats.sys) 和docker stats。 Docker stats 依賴 cgroup 來獲取記憶體使用...
    程式設計 發佈於2024-12-22
  • 如何在 PHP 中組合兩個關聯數組,同時保留唯一 ID 並處理重複名稱?
    如何在 PHP 中組合兩個關聯數組,同時保留唯一 ID 並處理重複名稱?
    在 PHP 中組合關聯數組在 PHP 中,將兩個關聯數組組合成一個數組是常見任務。考慮以下請求:問題描述:提供的代碼定義了兩個關聯數組,$array1 和 $array2。目標是建立一個新陣列 $array3,它合併兩個陣列中的所有鍵值對。 此外,提供的陣列具有唯一的 ID,而名稱可能重疊。要求是建...
    程式設計 發佈於2024-12-22

免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。

Copyright© 2022 湘ICP备2022001581号-3