首页 > 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
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板