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