18
function Person() {
      var self = this;

      self.personName="";
      self.animals=[];
}

function Animal(){
     var self=this;

     self.animalName="";
     self.run=function(meters){
         .....
     }
}

サーバーの応答:

 [{personName:John,animals:[{animalName:cheetah},{animalName:giraffe}]} , {personName:Smith,animals:[{animalName:cat},{animalName:dog}]} ]

サーバーから Person 配列を取得しています。ジェネリック Person 配列を型付き Person 配列にキャストしたい。だから私は使うことができます

 persons[0].Animals[2].Run();

Javascript を設立しました

 Object.create(Person,person1);

しかし、配列をサポートするクロスブラウザ版が欲しい

  ObjectArray.create(Person,persons);

また

 Object.create(Person[],persons);
4

4 に答える 4

19

JavaScript でオブジェクトを作成するには、そのコンストラクターを呼び出す必要があります。そのため、最初に正しい引数を見つける必要がありますが、これは常に単なるプロパティであるとは限りません。その後、JSON で解析されたオブジェクトから作成されたインスタンスにすべてのパブリック プロパティを再割り当てできます。

一般的な解決策は、すべてのコンストラクターがインスタンス (実際のインスタンスを含む) のように見えるすべてのオブジェクトを受け入れ、それらのクローンを作成することです。適切なインスタンスを作成するために必要なすべての内部ロジックは、適切な場所に配置されます。

または、コンストラクターをオーバーロードするよりも、オブジェクトを受け取り、それらからインスタンスを作成するクラスに静的メソッドを作成することをお勧めします。

Person.fromJSON = function(obj) {
    // custom code, as appropriate for Person instances
    // might invoke `new Person`
    return …;
};

引数がなく、パブリック プロパティのみがあるため、ケースは非常に単純です。{personName:John,animals:[]}オブジェクト インスタンスに変更するには、次を使用します。

var personLiteral = ... // JSON.parse("...");
var personInstance = new Person();
for (var prop in personLiteral)
    personInstance[prop] = personLiteral[prop];

Object.assignこれには、機能 (またはjQuery.extendES6 より前など) を使用することもできます。

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]);
    }
}

ところで、メソッドは各インスタンスではなくオブジェクトにrun追加される可能性があります。Animal.prototype

于 2012-08-04T18:04:27.003 に答える
3

いくつかのプロトタイプ メソッドを持つクラスがあり、それらのメソッドをオブジェクトで使用できるようにしたいだけのようです。http://jsfiddle.net/6CrQL/3/

function Person() {}

Person.prototype.speak = function() {
   console.log("I am " + this.personName);
};

Person.prototype.runAnimals = function() {
    this.animals.each(function(animal){
       animal.run();
    })
};

function Animal() {}

Animal.prototype.run = function() {
    console.log("My Animal " + this.animalName+ "  is running");
}

var untypedPersons =  [{personName:"John",animals:[{animalName:"cheetah"},{animalName:"giraffe"}]} , {personName:"Smith",animals:[{animalName:"cat"},{animalName:"dog"}]} ];   

function fromArray(arr, constructor) {
   return arr.map(function(obj){
       var typed = Object.create(constructor.prototype);
       // Now copy properties from the given object
       for (var prop in obj)  {
           typed[prop] = obj[prop];
       }
       return typed;
   });
}

var persons = fromArray(untypedPersons, Person);
// Attach prototype to each animals list in person
persons.each(function(person){
    person.animals = fromArray(person.animals, Animal);
});

persons.each(function(person){
    person.speak();
    person.runAnimals();  
});

__proto__誰もがプロパティhttp://jsfiddle.net/6CrQL/2/をサポートしていれば、これはすべてずっと簡単になる可能性があります (そして、すべてのコピーを避けることができます)。

persons.each(function(person){
  person.__proto__ = Person.prototype;
  person.animals.each(function(animal){
    animal.__proto__ = Animal.prototype;
  });
});

persons.each(function(person){
  person.speak();
  person.runAnimals();  
});​
于 2012-08-04T17:49:35.497 に答える
1

サーバーの応答を受け取り、必要な変数を作成する Person クラスで静的メソッドを作成するのはどうですか。

これは単なるアイデアです。これがあなたの問題に当てはまるかどうかを確認してください。

//Static method
Person.createObjects = function( response ) {
    var persons = [];
    for ( var p = 0; p < response.length; p++ ) {
        //Create Person
        var person = new Person( response[p].personName );
        //Create Animals
        for ( var a = 0; a < response[p].animals.length; a++ ) {
           var animal = new Animal( response[p].animals[a].animalName );
           //Push this animal into Person
           person.animals.push ( animal );
        }
        //Push this person in persons
        persons.push ( person );
    }
    //Return persons
    return persons;
}

//Now Create required persons by passing the server response
var persons = Person.createObjects ( response );
于 2012-08-04T16:59:47.530 に答える
1

まず第一に、JavaScript には C++、Java、C# のようなクラスはありません。したがって、実際には型付き配列を持つことはできません。

あなたがしていることは、基本的に変数では機能するはずですが、関数では機能しません。したがって、最初に関数を追加する必要があります。アイデアを得るために、次のコードを見てください。

<script type="text/javascript">

function Person() {
      var self = this;

      self.personName="";
      self.animals=[];
}

function Animal(){
     var self=this;

     self.animalName="";
     self.run=function(meters){
         7/... do something
     }
}

var persons = [{personName:"John",animals:[{animalName:"cheetah"},{animalName:"giraffe"}]} , {personName:"Smith",animals:[{animalName:"cat"},{animalName:"dog"}]} ];

//use this to assign run-function
var a = new Animal();

//assign run-function to received data
persons[0].animals[0].run = a.run;

//now this works
persons[0].animals[0].run();

</script>
于 2012-08-04T16:51:55.690 に答える