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中文网其他相关文章!