JavaScript でプレーン オブジェクトから実際のインスタンスを作成することは可能ですが、特定の課題が伴います。実際のシナリオとその解決策を見てみましょう。
2 つのクラス、人物と動物について考えてみましょう。サーバーは汎用の Person オブジェクトの配列を返します:
[ { personName: "John", animals: [{ animalName: "cheetah" }, { animalName: "giraffe" }] }, { personName: "Smith", animals: [{ animalName: "cat" }, { animalName: "dog" }] } ]
目的は、このオブジェクト配列を Person インスタンスの型付き配列にキャストして、person[0].Animals[2].Run などの呼び出しを可能にすることです。 ().
プレーン オブジェクトからインスタンスを作成するには、コンストラクターを呼び出してプロパティを正しく割り当てる必要があります。
一般的なアプローチは、コンストラクターにインスタンスに似たオブジェクトを受け入れさせ、クローンを作成することです。彼ら。内部インスタンス作成ロジックはコンストラクターによって処理されます。
別の解決策は、オブジェクトを取得してインスタンスを生成する静的メソッドを Person クラスに作成することです。
Person.fromJSON = function(obj) { // Custom code to create instances based on `obj` return ...; };
今回のような、コンストラクターがなくパブリック プロパティのみがある単純なケースでは、次のようにすることができます。
var personInstance = new Person(); for (var prop in personLiteral) personInstance[prop] = personLiteral[prop];
または、Object を使用することもできます。 assign:
var personInstance = Object.assign(new Person(), personLiteral);
同様のアプローチに従って、Animal インスタンスを作成します。
JSON はクラス情報を伝えないため、オブジェクト構造を事前に設定しておきます。あなたの場合、実装は次のようになります。
var persons = JSON.parse(serverResponse); for (var i=0; i<persons.length; i++) { persons[i] = $.extend(new Person, persons[i]); for (var j=0; j<persons[i].animals; j++) { persons[i].animals[j] = $.extend(new Animal, persons[i].animals[j]); } }
Animal クラスは、各インスタンスではなくプロトタイプで run メソッドを定義する可能性があります。
以上がプレーンな JavaScript オブジェクトをクラスのインスタンスにキャストするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。