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

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

Barbara Streisand
リリース: 2024-12-01 13:01:10
オリジナル
660 人が閲覧しました

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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート