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

Crockford のプロトタイプ継承はネストされたオブジェクトを正しく処理しますか?

Barbara Streisand
Barbara Streisandオリジナル
2024-12-11 01:49:10259ブラウズ

Does Crockford's Prototypal Inheritance Handle Nested Objects Correctly?

Crockford のプロトタイプ継承: ネストされたオブジェクトに関する問題

Douglas Crockford は、著書『Javascript: The Good Parts』の中で、単純化するためのパターンを紹介しています。オブジェクトの継承。このパターンは、既存のプロトタイプ オブジェクトに基づいて新しいオブジェクトを作成できる Object.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);

age プロパティの変更person1 の age プロパティは flatObj のプロパティを更新しますが、person2.info の age プロパティを変更すると、の age プロパティが誤って更新されます。 nesObj.info.

この動作はプロトタイプの継承に固有のものではなく、JavaScript がネストされたオブジェクトを処理する方法に固有のものです。 JavaScript では、オブジェクトのプロパティは、独自のプロパティ (オブジェクト自体で定義される) または継承されたプロパティ (プロトタイプ チェーンを介してアクセスされる) のいずれかになります。 Object.create を使用してオブジェクトが作成されると、そのプロトタイプ オブジェクトの独自のプロパティがすべて継承されます。

この問題を回避するには、ネストされたオブジェクトを新しいオブジェクトに明示的に割り当てる必要があります。上記の例では、次のコードは person2 の独立した情報オブジェクトを作成します。

var person2 = Object.create(nestObj);
person2.info = Object.create(nestObj.info);

このネストされたオブジェクトの分離により、person2 の info オブジェクトに加えられた変更が、nestObj の info オブジェクトに影響を与えなくなります。

以上がCrockford のプロトタイプ継承はネストされたオブジェクトを正しく処理しますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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