Créer un objet avec le même constructeur
Imaginez nous avons un objet arbitraire obj, créé par une fonction constructeur – nous ne savons pas lequel, mais nous aimerions créer un nouvel objet à l’aide de celui-ci.
Pouvons-nous le faire comme ça ?
let obj2 = new obj.constructor();
Donne un exemple de fonction constructeur pour obj qui laisse ce code fonctionner correctement. Et un exemple qui fait que ça marche mal.
Nous pouvons utiliser cette approche si nous sommes sûrs que la propriété "constructeur" a la valeur correcte.
Par exemple, si nous ne touchons pas le "prototype" par défaut, alors ce code fonctionne à coup sûr :
function User(name) {
this.name = name;
}
let user = new User('John');
let user2 = new user.constructor('Pete');
alert( user2.name ); // Pete (ça marche !)
Cela a fonctionné, car User.prototype.constructor == User.
…Mais si quelqu’un, pour ainsi dire, écrase User.prototype et oublie de recréer constructor pour faire référence à User, il échouera.
Par exemple :
function User(name) {
this.name = name;
}
User.prototype = {}; // (*)
let user = new User('John');
let user2 = new user.constructor('Pete');
alert( user2.name ); // undefined
Pourquoi user2.name est undefined ?
Voici comment new user.constructor('Pete') fonctionne :
- Tout d’abord, il cherche
constructordansuser. Rien. - Ensuite, il suit la chaîne de prototypes. Le prototype de
userestUser.prototype, et il n’a pas non plus deconstructor(parce que nous avons “oublié” de le régler correctement !). - En remontant la chaîne,
User.prototypeest un objet simple, son prototype est leObject.prototypeintégré. - Enfin, pour le
Object.prototypeintégré, il existe unObject.prototype.constructor == Objectintégré. Il est donc utilisé.
En fin de compte, nous avons let user2 = new Object('Pete').
Ce n’est probablement pas ce que nous voulons. Nous aimerions créer un new user, pas un new Object. C’est le résultat du constructor manquant.
(Juste au cas où vous seriez curieux, l’appel new Object(...) convertit son argument en un objet. C’est une chose théorique, en pratique personne n’appelle new Object avec une valeur, et généralement nous n’utilisons pas new Object pour créer des objets).