J’aurais pu utiliser
this et
call comme Sylvain l’a fait…
Car.call(Object.create(Car.prototype), ...args);
… Mais quand je fais ça, mes amis me jettent des pierres au visage alors j’essaye de perdre cette habitude.
Non, plus sérieusement, je vais donner des arguments : le fait que
this puisse être changé dynamiquement en JS rend le code moins prévisible, car on n’est jamais sûr de la valeur qu’aura
this à l’exécution. Utiliser
this c’est prendre le risque d’embrouiller les débutants et débutantes, qui ne maîtrisent pas forcément la mécanique de
call,
apply et
bind, et qui risqueraient de ne pas saisir comment tu veux que ton code soit utilisé.
Également, il y a le risque de pollution de l’espace global si tu n’y prends pas garde. Je ne sais plus si ça a déjà été discuté sur ce fil, mais rapidement :
1 2 3 4 5 6
| function constructSomething() {
this.someProp = "squalala";
}
// oups, jai oublié call
constructSomething(myObj); |
Comme il n’y a pas
"use strict", on est en mode sloppy et
this référence
window. Ce qui vient de se passer, c’est qu’on a ajouté
someProp à
window… Pas terrible.
En mode strict,
this est
undefined et on reçoit une erreur. C’est un peu mieux, mais si on ne connaît pas le truc de
call, ça ne nous aide pas beaucoup.
Oh tiens, une remarque comme ça : tu t’es déjà demandé ce qui se passe quand tu repasses un objet à son propre constructeur ?
1 2 3 4 5 6 7
| function Bidule(a, b) {
this.a = a;
this.b = b;
}
var bidule = new Bidule(23, 98);
Bidule.call(bidule, 66, 34); |
La réponse est : rien de spécial. Je l’ai déjà dit dans un autre post, le constructeur ne fait rien de plus que ce que tu as écrit dedans. Il n’y a pas de magie !
Partager