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中文網其他相關文章!