首页 >web前端 >js教程 >Crockford 的原型继承是否正确处理嵌套对象?

Crockford 的原型继承是否正确处理嵌套对象?

Barbara Streisand
Barbara Streisand原创
2024-12-11 01:49:10259浏览

Does Crockford's Prototypal Inheritance Handle Nested Objects Correctly?

Crockford 的原型继承:嵌套对象的问题

Douglas Crockford 在他的书《Javascript:好的部分》中提出了一种简化模式对象继承。此模式基于 Object.create 方法,该方法允许基于现有原型对象创建新对象。

虽然此模式适用于平面对象,但在处理嵌套对象时会出现问题。覆盖使用此模式继承的嵌套对象的值会影响原型链上的嵌套元素。

例如,在以下代码中:

var flatObj = {
  firstname: "John",
  lastname: "Doe",
  age: 23
};
var person1 = Object.create(flatObj);

var nestObj = {
  sex: "female",
  info: {
    firstname: "Jane",
    lastname: "Dough",
    age: 32
  }
};
var person2 = Object.create(nestObj);

更改age属性person1 的age属性更新了flatObj的age属性,但是更改person2.info的age属性错误地更新了age属性NestObj.info.

这种行为不是原型继承所固有的,而是 JavaScript 处理嵌套对象的方式所固有的。在 JavaScript 中,对象的属性可以是自己的属性(在对象本身上定义)或继承的属性(通过原型链访问)。当使用 Object.create 创建对象时,它会继承其原型对象的所有属性。

为了避免此问题,应将嵌套对象显式分配给新对象。在上面的示例中,以下代码将为 person2 创建一个独立的 info 对象:

var person2 = Object.create(nestObj);
person2.info = Object.create(nestObj.info);

这种嵌套对象的分离可确保对 person2 的 info 对象进行的更改不会影响 NestObj 的 info 对象。

以上是Crockford 的原型继承是否正确处理嵌套对象?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn