Question Peut-on convertir un objet générique en un type d'objet personnalisé en javascript?


Par exemple, j'ai déjà cet objet quelque part dans le code, c'est un objet générique:

var person1={lastName:"Freeman",firstName:"Gordon"};

J'ai le constructeur d'un objet Person:

function Person(){
 this.getFullName=function(){
  return this.lastName + ' ' + this.firstName;
 }
}

Existe-t-il une syntaxe simple permettant de convertir person1 en un objet de type Person?


34
2018-01-05 02:26


origine


Réponses:


La réponse de @PeterOlson peut être travaillée dans la journée mais elle ressemble à Object.create est changé.   Je voudrais aller de la manière de copier-constructeur comme @ user166390 dit dans les commentaires.
  La raison pour laquelle j'ai nécromé cet article est que j'avais besoin d'une telle implémentation.

De nos jours, nous pouvons utiliser Object.assign (crédits à la solution @SayanPal) & Syntaxe ES6:

class Person {
  constructor(obj) {
    obj && Object.assign(this, obj);
  }

  getFullName() {
    return `${this.lastName} ${this.firstName}`;
  }
}

Usage:

const newPerson = new Person(person1)
newPerson.getFullName() // -> Freeman Gordon

ES5 répondre ci-dessous

function Person(obj) {
    for(var prop in obj){
        // for safety you can use the hasOwnProperty function
        this[prop] = obj[prop];
    }
}

Usage:

var newPerson = new Person(person1);
console.log(newPerson.getFullName()); // -> Freeman Gordon

En utilisant une version plus courte, 1.5 liner:

function Person(){
    if(arguments[0]) for(var prop in arguments[0]) this[prop] = arguments[0][prop];
}

jsfiddle


26
2018-05-22 18:43



Non. 

Mais si vous cherchez à traiter votre person1 objet comme si c'était un Person, vous pouvez appeler des méthodes sur Personle prototype sur person1 avec call:

Person.prototype.getFullNamePublic = function(){
    return this.lastName + ' ' + this.firstName;
}
Person.prototype.getFullNamePublic.call(person1);

Bien que cela ne fonctionne évidemment pas pour les méthodes privilégiées créées à l’intérieur du constructeur de type Person, comme votre getFullName méthode.


6
2018-01-05 02:46



Ce n’est pas exactement une réponse, mais plutôt un partage de mes conclusions et, espérons-le, un argument critique pour / contre, car je ne suis pas au courant de son efficacité.

J'ai récemment eu besoin de le faire pour mon projet. Je l'ai fait en utilisant Object.assign, plus précisément on fait quelque chose comme ceci:Object.assign(new Person(...), anObjectLikePerson).

Voici un lien vers mon JSFiddle, ainsi que la partie principale du code:

function Person(firstName, lastName) {
  this.firstName = firstName;
  this.lastName = lastName;

  this.getFullName = function() {
    return this.lastName + ' ' + this.firstName;
  }
}

var persons = [{
  lastName: "Freeman",
  firstName: "Gordon"
}, {
  lastName: "Smith",
  firstName: "John"
}];

var stronglyTypedPersons = [];
for (var i = 0; i < persons.length; i++) {
  stronglyTypedPersons.push(Object.assign(new Person("", ""), persons[i]));
}

3
2018-01-13 10:06



Cela emprunte à quelques autres réponses ici, mais j'ai pensé que cela pourrait aider quelqu'un. Si vous définissez la fonction suivante sur votre objet personnalisé, vous avez alors une fonction de fabrique dans laquelle vous pouvez passer un objet générique et il vous renverra une instance de la classe.

CustomObject.create = function (obj) {
    var field = new CustomObject();
    for (var prop in obj) {
        if (field.hasOwnProperty(prop)) {
            field[prop] = obj[prop];
        }
    }

    return field;
}

Utilisez comme ça

var typedObj = CustomObject.create(genericObj);

1
2017-12-16 13:02



Ceci est juste un résumé de la réponse de Sayan Pal sous une forme plus courte, le style ES5:

var Foo = function(){
    this.bar = undefined;
    this.buzz = undefined;
}

var foo = Object.assign(new Foo(),{
    bar: "whatever",
    buzz: "something else"
});

Je l'aime bien parce que c'est le plus proche de l'initialisation d'objet très soignée dans .Net:

var foo = new Foo()
{
    bar: "whatever",
    ...

0
2018-05-15 13:36