web-dev-qa-db-ja.com

JSONからJavaScriptクラスへ

NosqlデータベースからこのJsonオブジェクトを取得するhttpリクエストがあります。

let jsonBody = {
    birthday : 1997,
    firstname: 'foo',
    lastname:'bar'
}

次に、この情報をStudentモデルにロードします。

class Student{
    constructor(){

    }

    getFullname(){
        return this.lastname+' '+this.firstname
    }
    getApproxAge(){
        return 2018- this.birthday
    }
}

通常、このクラスにこのメソッドを追加します。

fromJson(json){
    this.studentId = json.studentId;
    this.birthday = json.birthday;
    this.firstname = json.firstname;
    this.lastname = json.lastname;
}

私はそれを次のように使用します:

let student = new Student()
student.fromJson(jsonBody)
console.log(student.getFullname())
console.log(student.getApproxAge())

これは正常に機能しますが、私の問題は次のとおりです。 fromJsonメソッドですべてのプロパティを1つずつ記述する必要がありますか?

また、所有権の名前が変更された場合、たとえば、lastnameがLastNameになった場合、それを修正する必要がありますか?

これらの値をオブジェクトStudentに動的に割り当てるだけで、そのメソッドをすべて保持する簡単な方法はありますか?

このようなもの:

fromJson(json){
    this = Object.assign(this, json) //THIS IS NOT WORKING
}
7
TSR

インスタンスに割り当てるだけです:

 static from(json){
   return Object.assign(new Student(), json);
 }

だからあなたはできる:

 const student = Student.from({ name: "whatever" });

または、インスタンスメソッドにして、担当者を除外します。

 applyData(json) {
   Object.assign(this, json);
 }

だからあなたはできる:

 const student = new Student;
 student.applyData({ name: "whatever" });

また、コンストラクタの一部にすることもできます。

 constructor(options = {}) {
  Object.assign(this, options);
 }

それからあなたはすることができます:

 const student = new Student({ name: "whatever" });

また、プロパティ名が変更された場合、たとえば、lastnameがLastNameになった場合、それを修正する必要がありますか?

はい、それを修正する必要があります。

14
Jonas Wilms