Héritage

MéthodeObject.create

En JavaScript, on peut créer un objet à partir d'un autre objet. Le nouvel objet crée un lien de prototype avec l'original.

1
const element = {
2
  prop1 : "valeur1",
3
  prop2 : "valeur2",
4
}
5
const enfant = Object.create(element);
Héritage

element est appelé le prototype de enfant.

enfant a accès aux propriétés de son prototype.

Testez le code précédent et vérifiez les instructions suivantes :

1
element
2
enfant
3
enfant.prop1

Si element.prop1 est modifiée alors enfant.prop1 est naturellement modifiée.

Testez le code

1
element.prop1 = 5;
2
enfant.prop1;

MéthodeNouvelle propriété

On peut ajouter de nouvelles propriétés à notre objet.

1
const element = {
2
  prop1 : "valeur1",
3
  prop2 : "valeur2",
4
}
5
const enfant = Object.create(element);
6
enfant.prop3 = "valeur3" ;
Héritage

Testez le code précédent et vérifiez les instructions suivantes :

1
element
2
enfant

MéthodeModifier une propriété parente

Si on modifie une propriété du prototype sur l'enfant, celle-ci surcharge l'originale.

1
const element = {
2
  prop1 : "valeur1",
3
  prop2 : "valeur2",
4
}
5
const enfant = Object.create(element);
6
enfant.prop1 = "valeur3" ;
Héritage

Testez le code précédent et vérifiez les instructions suivantes :

1
enfant
2
element

MéthodeHéritage de Object

Lorsque vous créez un nouvel objet, celui-ci hérite par défaut de l'objet prototype Object. Il a donc accès aux propriétés et méthodes de cet objet.

1
const objet = {}
Héritage de prototype Object

Vous pouvez vérifier cet héritage à l'aide de l'autocomplétion de la console.

Héritage de Object

Testez le code précédent dans la console.

MéthodePropriété directe ou héritée d'un objet

Si on veut connaître l'origine de la propriété.

C'est à dire si elle appartient à l'objet ou si elle est héritée.

On utilise la méthode hasOwnProperty.

1
const element = {
2
  prop1 : "valeur1",
3
  prop2 : "valeur2",
4
}
5
const enfant = Object.create(element);
6
enfant.prop3 = "valeur3" ;

Testez le code précédent et vérifiez les instructions suivantes :

1
enfant.hasOwnProperty('prop1')
2
enfant.hasOwnProperty('prop3')

DéfinitionDélégation

Un objet créé à partir d'un autre peut lui-même devenir le parent d'un nouvel objet.

Comme on l'a vu précédemment, dans cette suite d'héritage, il existe un parent source prototype Object.

1
const element = {
2
  prop1 : "valeur1",
3
  prop2 : "valeur2",
4
}
5
const enfant = Object.create(element );
6
const petitEnfant = Object.create(enfant) ;

Lorsque vous voulez récupérer une propriété, si l'objet ne la possède pas,

le JavaScript la cherche dans son prototype.

S'il ne la trouve pas, alors il la recherche dans le prototype du prototype

et ainsi de suite jusque prototype Object (objet source de tout objet).

Cette démarche s'appelle la délégation.

Délégation

Testez le code précédent et vérifiez les instructions suivantes :

1
element
2
enfant
3
petitEnfant.prop3

Définitiondelete

Pour récupérer la valeur des propriétés des prototypes, on peut effacer les propriétés d'un objet.

1
const element = {
2
  prop1 : "valeur1",
3
  prop2 : "valeur2",
4
}
5
const enfant = Object.create(element);
6
enfant.prop1 = "valeur3" ;
7
delete enfant.prop1;
8
delete element.prop2;

Testez le code précédent et vérifiez les instructions suivantes :

1
element
2
enfant
3
enfant.prop1

MéthodePropriétés communes.

Plusieurs objets peuvent hériter du même objet.

1
const parent = {
2
  prop1 : "valeur1",
3
  prop2 : "valeur2",
4
}
5
const enfant1 = Object.create(parent);
6
enfant.prop3 = "valeur3" ;
7
const enfant2 = Object.create(parent);
8
enfant.prop3 = "valeur4" ;
9
const enfant3 = Object.create(parent);
10
enfant.prop3 = "valeur5" ;
Héritage

Ceci permet d'économiser de la mémoire. En effet, prop1 et prop2 sont stockées une seule fois, au lieu de trois.

MéthodeCréation plus ajout de propriétés

On peut créer le nouvel objet et lui ajouter ses propriétés en une instruction

1
const element = {
2
  prop1 : "valeur1",
3
  prop2 : "valeur2",
4
}
5
const enfant = Object.create(element, {
6
  prop3 : {
7
            value: "valeur3",
8
            writable: true,
9
            enumerable: true,
10
            configurable: true
11
           }
12
});

value : valeur de la propriété. Par défaut : undefined.

writable : mettre à true, si on veut pouvoir modifier la valeur. Par défaut : false.

enumerable : mettre à true, si on veut que la propriété soit énumérable. Par défaut : false.

configurable : mettre à true, si on veut pouvoir supprimer la propriété. Par défaut : false.

On peut remplacer value par set et get en supprimant writable.

Héritage

MéthodeCréation plus ajout de propriétés et méthodes

On peut créer le nouvel objet et lui ajouter ses propriétés en une instruction en utilisant la méthode assign de Object.

La méthode assign permet de copier les propriétés et méthodes énumérables et non héritables d'un objet dans un autre (donc pas les get et les set).

1
const objet1 = {a:true, b(){return true}};
2
const objet2 = {c:true}
3
Object.assign(objet2, objet1);

objet2 reçoit une copie de toutes les propriétés et méthodes non héritables de objet1.

On utilise ce principe pour copier le contenu d'un objet dans un enfant nouvellement créé.

1
const parent = {
2
  prop1 : "valeur1",
3
  prop2 : "valeur2",
4
}
5
const enfant = Object.assign(Object.create(parent), {
6
  prop3 : "valeur3",
7
  meth1(){return true;}
8
});
Héritage

MéthodeCréation plus ajout de propriétés et méthodes énumérables et héritables

On peut créer le nouvel objet et lui ajouter ses propriétés en une instruction en utilisant la méthode defineProperties de Object.

La méthode defineProperties permet de copier les propriétés et méthodes énumérables et héritables d'un objet dans un autre.

Pour cela l'objet contenant les propriétés et méthodes à ajouter doit être un objet contenant les descripteurs. La méthode getOwnPropertyDescriptors permet de générer les descripteurs d'un objet.

1
const parent = {
2
  prop1 : "valeur1"
3
}
4
const descripteurs = Object.getOwnPropertyDescriptors({
5
  valeur : 0,
6
  get prix(){return this.valeur + "€";},
7
  set prix(prix){this.valeur = parseFloat(prix);}
8
});
9
const enfant = Object.defineProperties(Object.create(parent), descripteurs);
Héritage

MéthodeObject.create(parent, descriptors)

Pour ajouter des descripteurs, on peut aussi utiliser le deuxième paramètre de la méthode create de Object.

1
const parent = {
2
  prop1 : "valeur1"
3
}
4
const enfant = Object.create(parent, Object.getOwnPropertyDescriptors ({
5
  valeur : 0,
6
  get prix(){return this.valeur + "€";},
7
  set prix(prix){this.valeur = parseFloat(prix);}
8
}));

MéthodeParent

Pour revenir à l'objet parent, on utilise la méthode Object.getPrototypeOf(obj) ou __proto__

1
const parent = {
2
  prop1 : "valeur1",
3
  prop2 : "valeur2",
4
}
5
const enfant = Object.create(parent);

Testez le code précédent et vérifiez les instructions suivantes :

1
Object.getPrototypeOf(enfant) === parent;
2
enfant.__proto__ === parent;