La réponse de @PeterOlson a peut-être fonctionné à l'époque mais il semble que Object.create
a changé. J'opterais pour la méthode de la copie-constructeur comme l'a dit @user166390 dans les commentaires.
La raison pour laquelle j'ai nécromancé ce post est que j'avais besoin d'une telle mise en œuvre.
Aujourd'hui, nous pouvons utiliser Object.assign
( crédits à la solution @SayanPal ) et la syntaxe ES6 :
class Person {
constructor(obj) {
obj && Object.assign(this, obj);
}
getFullName() {
return `${this.lastName} ${this.firstName}`;
}
}
Utilisation :
const newPerson = new Person(person1)
newPerson.getFullName() // -> Freeman Gordon
Réponse ES5 ci-dessous
function Person(obj) {
for(var prop in obj){
// for safety you can use the hasOwnProperty function
this[prop] = obj[prop];
}
}
Utilisation :
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];
}
11 votes
Il n'y a pas de casting en JavaScript donc ... la réponse courte est non. La réponse plus longue est ... toujours non. En effet, le [[prototype]] ne peut être défini que lorsqu'un objet est créé. Cependant, il est possible de copier les méthodes/propriétés de Person vers person1, ce qui est une approche utilisée par certains "class frameworks" de toute façon. Je me contenterais probablement de créer un nouveau Personne de personne1 dans un "copieur-constructeur".