Contexte rapide: en JavaScript, la fonction constructeur de chaque type d'objet a une prototype
propriété. Le prototype
fait référence à un objet que chaque objet construit utilise comme étape suivante de sa chaîne de prototypes. Lorsque vous souhaitez qu'un type soit inhérent à un autre type, vous pouvez définir le prototype
type enfant sur une nouvelle instance du type parent.
Par exemple:
var Parent = function() { /* constructor business */ }
Parent.prototype.parentProp = "some parent property";
var Child = function() { /* constructor business */ }
Child.prototype = /*** !! Some prototype object goes here !! ***/
Ma question demande quel code doit aller " Some prototype object goes here
" dans le code ci-dessus. Mon premier réflexe est de construire une instance du parent (ie new Parent()
), mais dans un commentaire à une réponse sur Est-ce un moyen sûr de copier un prototype d'objets sur un autre? , un utilisateur écrit:
Non, ne l'utilisez pas
new bar()
pour l'objet prototype!
(... qui est une opinion que j'ai vue dans de nombreuses réponses et commentaires de SO, mais c'est le seul exemple que j'ai en main pour le moment.)
L'autre option est d'utiliser Object.create(Parent.prototype)
comme Child.prototype
. Pour autant que je sache, cela crée également une nouvelle Parent
instance, mais il n'exécute pas le Parent
constructeur.
Quelqu'un peut-il expliquer pourquoi l'exécution de la fonction constructeur doit être évitée lors de la génération d'un objet prototype à partir d'un type parent? Y a-t-il un problème technique important qui se pose (peut-être avec plusieurs niveaux d'héritage)? Ou un tel modèle est-il une mauvaise utilisation des constructeurs qui se heurte à certaines meilleures pratiques prototypiques (par exemple, l'exécution du constructeur lors de la création d'un prototype viole une certaine séparation des préoccupations)?
Object.create
met en œuvre.