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

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

DDD
リリース: 2024-12-05 18:24:13
オリジナル
555 人が閲覧しました

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

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

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