Prototype
Chaque objet est lié à une propriété prototype
qui est un autre objet duquel il hérite des propriéts. Les objets créés directement avec les accolades ({}
) sont automatiquement associés à Object.prototype
, qui est un standard du JavaScript.
Lorsque l'interpréteur JavaScrit essaye de trouver une propriété à laquelle on essaie d'accéder comme à travers ce code:
let adult = { age: 26 },
retrievedProperty = adult.age;
// The line above
L'interpréteur recherche d'abord à travers toutes les propriétés de l'objet lui-même. Par exemple l'objet adult
n'a qu'une seule propriété — age
. Mais à côté de celui-là, en réalité il en a d'autres qu'il a hérité de Object.prototype.
let stringRepresentation = adult.toString();
// the variable has value of '[object Object]'
La méthode toString
est une propriété de l'objet Object.prototype
dont adult
a hérité. C'est une fonction qui renvoie la représentation textuelle de l'objet. Si vous voulez avoir une représentation plus personnalisée, alors vous pouvez surcharger la méthode (ou la fonction); c'est-à-dire, définir votre propre version de la méthode. Et pour ce faire, on procède comme suit:
adult.toString = function () {
return "J'ai " + this.age + ' ans';
};
Si maintenant nous appelons la méthode toString
, l'interpréteur va retrouver cette propriété dans l'objet adult
lui-même.
Ainsi, l'interpréteur retourne la première valeur qu'il retrouve en partant de l'objet lui-même et descendant prototype par prototype.
Pour déclarer notre objet adult
comme prototype au lieu de Object.prototype
, nous pouvons invoquerla méthode Object.create
comme suit:
let child = Object.create(adult);
/**
* Cette façon de créer les objets nous laisse le champ libre de remplacer l'objet par défaut qui est Object.prototype avec celui que l'on vaut.
* Dans ce cas-ci, le prototype de child est l'objet adult.
*/
child.age = 8;
/**
* Avant, child n'avait pas sa propriété age, donc pour la trouver, l'interpréteur devait aller chercher sur son prototype.
* Maintenant, quand nous affectons un age à child, l'interpréteur ne va pas trop loin pour la trouver.
* Note: La propriété age de adult démeure 26.
*/
let stringRepresentation = child.toString();
// Maintenant, le résultat de cet appel est évidemment : "J'ai 8 ans".
/**
* Note: Nous n'avons pas ici surchargé la propriété toString, donc c'est l'implémentation qu'on a mise dans adult qui sera invoquée.
* Si adult n'avait pas de méthode toString, alors il s'agit de celle de Object.prototype qui serait invoquée et nous aurions eu comme résultat: "[object Object]" au lieu de "J'ai 8 ans"
*/
Le prototype de child
est adult
, dont le prototype est lui même Object.prototype
. Cette séquence de prototype est appelée chaîne de prototypes.