首頁 > web前端 > js教程 > 修改 Crockford 原型繼承中的嵌套物件時如何避免意外行為?

修改 Crockford 原型繼承中的嵌套物件時如何避免意外行為?

Mary-Kate Olsen
發布: 2024-12-31 08:57:09
原創
478 人瀏覽過

How to Avoid Unexpected Behavior When Modifying Nested Objects in Crockford's Prototypal Inheritance?

Crockford 的原型繼承:解決巢狀問題

Douglas Crockford 的原型繼承概念提供了一種簡化的物件建立方法,如「Object.create」函數所示。然而,使用者在處理這個繼承框架中的嵌套物件時可能會遇到困難。具體來說,覆蓋嵌套物件值可能會影響原型鏈上的其他對象,從而導致意外結果。

為了說明問題,請考慮以下程式碼片段:

// Flat object
var flatObj = {
    firstname: "John",
    lastname: "Doe",
    age: 23
}

// Nested object
var nestObj = {
    sex: "female",
    info: {
        firstname: "Jane",
        lastname: "Dough",
        age: 32  
    }
}
登入後複製

在此場景中,使用「Object.create」建立新物件並嘗試修改嵌套物件值會導致原型對象發生意外變更:

// Objects created using Object.create
var person1 = Object.create(flatObj);  // Flat object inheritance
var person2 = Object.create(nestObj);  // Nested object inheritance

// Overwriting nested object values
person1.age = 69;
person2.info.age = 96;

// Prototype objects have been modified
console.log(nestObj.info.age);  // Outputs 96 instead of 32
登入後複製

核心問題源自於這樣一個事實:所有物件(包括巢狀物件)都被視為標準物件屬性。修改嵌套物件值時,變更不僅會傳播到目前對象,還會傳播到從同一原型繼承的任何其他物件。

因此,如果您希望維護獨立的嵌套對象,至關重要為它們創建新對象而不是依賴繼承。例如:

// Creating an independent nested object
person3 = {
    sex: "male",
    info: Object.create(nestObj2.info)  // Create a new object for the nested "info" property
}
登入後複製

透過這樣做,您可以確保對嵌套物件值的變更僅影響特定對象,並且不會沿著原型鏈向上傳播。

以上是修改 Crockford 原型繼承中的嵌套物件時如何避免意外行為?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板