Ce n'est pas une réponse directe, mais une connaissance que tous ceux qui traitent de l'héritage en Javascript devraient avoir.
L'héritage des prototypes en Javascript est un concept délicat. Jusqu'à présent, il était impossible de créer un objet vide (par vide, je veux dire dépourvu même des propriétés de la forme Object via le prototype). Cela signifie donc que la création d'un nouvel objet avait toujours un lien avec le prototype original de l'Object. Cependant, selon la spécification, la chaîne de prototype d'une instance d'objet n'est pas visible, mais certains fournisseurs ont décidé d'implémenter leurs propres propriétés d'objet propriétaires afin que vous puissiez la suivre, mais il est fortement recommandé de ne pas l'utiliser dans le code de production.
L'exemple de code suivant démontre seulement deux façons de créer une instance d'objet.
var someObject = {};
var otherObject = new Object();
var thirdObject = Object.create({});
Même si vous n'ajoutez pas manuellement les propriétés d'objet aux accolades vides, vous obtenez quand même une chaîne de prototypes ajoutée automatiquement. Il en va de même pour le deuxième exemple. Pour mieux visualiser, vous pouvez taper ces lignes dans la console de Chrome et ensuite entrer soit someObject
, otherObject
o thirdObject
pour voir les détails. Chrome montre la chaîne de prototypes en ajoutant une propriété propriétaire __proto__
que vous pouvez développer pour voir ce qui est hérité et d'où ça vient. Si vous avez exécuté quelque chose comme
Object.prototype.sayHello = function() {
alert('hello');
};
vous seriez en mesure de l'appeler sur toutes les instances, en exécutant otherObject.sayHello()
.
Toutefois, grâce à un élément qui a été mis en œuvre assez récemment (et qui n'est donc pas pris en charge par tous les navigateurs), il est possible de créer une instance d'objet véritablement vide (qui n'hérite même pas de l'objet lui-même).
var emptyObject = Object.create(null);
Lorsque vous l'entrez dans la console de Chrome et que vous développez ensuite le fichier emptyObject
pour voir sa chaîne de prototypes, vous pouvez voir qu'elle n'existe pas. Donc, même si vous avez implémenté le sayHello
au prototype d'objet, il serait impossible d'appeler la fonction emptyObject.sayHello()
depuis emptyObject
n'hérite pas du prototype d'objet.
J'espère que cela vous aidera un peu à comprendre l'idée générale.