ホームページ >ウェブフロントエンド >jsチュートリアル >Crockford のプロトタイプ継承は、ネストされたオブジェクトとその継承をどのように処理しますか?

Crockford のプロトタイプ継承は、ネストされたオブジェクトとその継承をどのように処理しますか?

Barbara Streisand
Barbara Streisandオリジナル
2024-12-01 13:01:10655ブラウズ

How Does Crockford's Prototypal Inheritance Handle Nested Objects and Their Inheritance?

Crockford のプロトタイプ継承: ネストされたオブジェクトと継承

Douglas Crockford の「Javascript: The Good Parts」では、オブジェクトを利用してオブジェクトの継承を簡素化することを提唱しています。落とし穴を避けるための .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);

上記の例では、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 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。