JSON в класс Javascript - PullRequest
       28

JSON в класс Javascript

0 голосов
/ 13 сентября 2018

У меня есть запрос http, который получает этот объект Json из базы данных nosql:

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

Затем я хочу загрузить эту информацию в модель Стьюдента:

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())

Это прекрасно работает, но моя проблема в том, что у меня есть: 100 свойств в реальности.Придется ли мне писать все свойства по одному в методе fromJson?

А также, если имя свойства изменилось, скажем: lastname стало LastName, мне придется это исправить?

Есть ли более простой способ динамически присваивать эти значения объекту-ученику, но сохранять все его методы ??

Примерно так:

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

1 Ответ

0 голосов
/ 13 сентября 2018

Просто присвойте экземпляру:

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

Таким образом, вы можете сделать:

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

Или сделать его методом экземпляра и пропустить assignemnt:

 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, мне придется это исправить?

Да, вам придется это исправить.

...