Crockford 的原型继承:嵌套对象和继承
Douglas Crockford 的“Javascript:好部分”提倡利用对象来简化对象继承.create() 方法可以避免 new 关键字的陷阱。然而,在使用这种模式时,人们对嵌套对象的行为产生了担忧。
为了说明这个问题,请考虑以下示例:
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);
在上面的示例中,person1 对象继承从 flatObj 继承,而 person2 对象从 NestObj 继承。当在继承对象中修改嵌套对象的属性时,它会影响原型链上的嵌套对象。
person1.age = 69; // Overwrites `age` in `person1` person2.info.age = 96; // Overwrites `age` in `person2` and `nestObj`
因此,原始嵌套对象被更改,即使更改是有意为之的仅适用于继承的对象。
此行为对于平面对象不一致。如果修改了 flatObj.age,则不会影响 person1 的age属性。
flatObj.age = 23; // Only affects `flatObj`
出现不一致的原因是在此继承模式中,嵌套对象与平面对象的处理方式不同。
解决限制
嵌套对象模式的限制可以通过创建来解决嵌套属性的独立对象,然后再分配它们:
person3 = { sex: "male" } person3.info = Object.create(nestObj2.info);
通过这样做,person3 的 info 属性成为一个独立对象,不受对原型链上的嵌套对象所做的更改的影响。
但是,需要注意的是,这种方法不会创建完全独立的对象。如果嵌套对象的某个属性在继承对象中被删除,它也会从原型对象中删除:
delete child.x; // (child).x.a == 0, because child inherits from parent
综上所述,Crockford 的嵌套对象原型继承模式确实有局限性。但是,可以通过在分配嵌套属性之前为嵌套属性创建独立对象来部分解决这些限制。
以上是Crockford 的原型继承如何处理嵌套对象及其继承?的详细内容。更多信息请关注PHP中文网其他相关文章!