Crockford のプロトタイプの継承: ネストされたオブジェクトに関する問題
Douglas Crockford の著書『Javascript: The Good Parts』で概説されている、プロトタイプの継承パターン。オブジェクトの継承を簡素化し、オブジェクトの継承に伴う混乱を回避します。 「新しい」というキーワード。ただし、このパターンを使用してネストされたオブジェクトから継承しようとすると、問題が発生します。ネストされたオブジェクトのプロパティを上書きすると、プロトタイプ チェーン全体に影響します。
次のコードを検討してください。
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); var nestObj2 = { sex: "male", info: { firstname: "Arnold", lastname: "Schwarzenneger", age: 61 } } var person3 = { sex: "male" } person3.info = Object.create(nestObj2.info); // now change the objects: person1.age = 69; person2.info.age = 96; person3.info.age = 0; // prototypes should not have changed: flatObj.age // 23 nestObj.info.age // 96 ??? nestObj2.info.age // 61 // now delete properties: delete person1.age; delete person2.info.age; delete person3.info.age; // prototypes should not have changed: flatObj.age // 23 nestObj.info.age // undefined ??? nestObj2.info.age // 61
この中でたとえば、ネストされたオブジェクトnestObjから継承した後、person2のネストされたオブジェクトのプロパティを変更すると、プロトタイプのnestObjに影響があり、person3のプロパティにも同様に影響します。ネストされたオブジェクト。これは予期しない動作であり、個々のオブジェクトへの変更を分離するというパターンの本来の目的が損なわれます。
この不一致の理由は、JavaScript オブジェクトの継承の基本的な性質にあります。オブジェクトが別のオブジェクトを継承すると、独立したコピーを作成するのではなく、そのオブジェクトのプロパティへの参照が作成されます。これは、継承されたプロパティに加えられた変更はすべて、子オブジェクトとプロトタイプの両方に反映されることを意味します。
この問題を回避するには、ネストされたプロパティを継承する前に、ネストされたプロパティの新しいオブジェクトを明示的に作成する必要があります。これにより、ネストされたプロパティへの変更が子オブジェクトに分離されるようになります。したがって、正しいコードは次のようになります:
person3.info = Object.create(nestObj2.info); // Create a new object for the nested property person3.info.age = 0; // Change the age property without affecting the prototype
以上がCrockford のプロトタイプ継承は、ネストされたオブジェクトとプロパティの変更をどのように処理しますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。