J'ai une requête http qui obtient cet objet Json d'une base de données nosql:
let jsonBody = {
birthday : 1997,
firstname: 'foo',
lastname:'bar'
}
Ensuite, je veux charger ces informations dans le modèle étudiant:
class Student{
constructor(){
}
getFullname(){
return this.lastname+' '+this.firstname
}
getApproxAge(){
return 2018- this.birthday
}
}
Normalement, j'ajouterais cette méthode à cette classe:
fromJson(json){
this.studentId = json.studentId;
this.birthday = json.birthday;
this.firstname = json.firstname;
this.lastname = json.lastname;
}
Je l'utiliserais comme suit:
let student = new Student()
student.fromJson(jsonBody)
console.log(student.getFullname())
console.log(student.getApproxAge())
Cela fonctionne bien mais mon problème est que j'ai: 100 propriétés en réalité. Dois-je écrire toutes les propriétés une par une dans la méthode fromJson?
Et aussi, si un nom de propriété a changé, disons: le nom est devenu LastName, je vais devoir le réparer?
Existe-t-il un moyen plus simple d'affecter dynamiquement ces valeurs à l'étudiant objet mais de conserver toutes ses méthodes ??
Quelque chose comme ça:
fromJson(json){
this = Object.assign(this, json) //THIS IS NOT WORKING
}
Attribuez simplement à une instance:
static from(json){
return Object.assign(new Student(), json);
}
Vous pouvez donc faire:
const student = Student.from({ name: "whatever" });
Ou faites-en une méthode d'instance et laissez de côté l'assignation:
applyData(json) {
Object.assign(this, json);
}
Afin que vous puissiez:
const student = new Student;
student.applyData({ name: "whatever" });
Il pourrait également faire partie du constructeur:
constructor(options = {}) {
Object.assign(this, options);
}
Ensuite, vous pourriez faire:
const student = new Student({ name: "whatever" });
Et aussi, si un nom de propriété a changé, disons: lastname est devenu LastName, je vais devoir le réparer?
Oui, vous devrez résoudre ce problème.