Comprendre l’héritage prototypique de JavaScript

Héritage

L’héritage est le processus par lequel un objet peut être basé sur un autre. Cela permet aux objets de partager les propriétés de chacun.

J’ai créé le prototype Hero et je l’ai utilisé pour créer un nouvel objet nommé superman. Mais nous ne faisons rien avec cet objet. Alors occupons-nous de cela en créant une autre fonction appelée dialogue.

function dialogue() {
console.log('I am ' + this.name);
}

Mais si nous exécutons notre code maintenant, rien ne va se passer parce que cette fonction ne sait pas quel est réellement le nom. Pour cela, nous devons

Je veux que cette nouvelle fonction ait les mêmes propriétés que celle de la Hero. Au lieu de les écrire à l’intérieur de cette fonction, nous pouvons simplement dire à JavaScript de les hériter du prototype Hero.

Cela est possible avec l’aide de la propriété prototype qui est disponible au sein de n’importe quel objet en JavaScript.

En plaçant dialogue sur Hero.prototype, nous l’avons rendu disponible à toutes les instances de Hero.

Héritage différentiel

JavaScript est également livré avec un autre modèle d’héritage appelé « héritage différentiel ». Dans ce modèle, les méthodes ne sont pas copiées du parent à l’enfant. Mais au lieu de cela, il existe un lien entre les enfants et leur objet parent.

Ici, superman n’a pas réellement sa propre méthode appelée dialogue(). Mais alors, comment fonctionne superman.dialogue() ?

Lorsque le moteur JavaScript rencontre superman.dialogue()dans le code, il recherche la propriété appelée dialogue à l’intérieur de l’objet superman. Lorsqu’il n’en trouve pas, il remonte la chaîne des prototypes jusqu’au parent Hero.prototype de superman. Là, il trouvera Hero.prototype.dialogue et l’appellera avec un this qui est lié à superman.

Object.create()

Nous pouvons rendre cela encore plus exclusif en créant une nouvelle classe pour Superman qui héritera des propriétés du prototype Hero. Nous pouvons le faire en assignant le prototype de Superman au prototype de Hero comme ceci:

function Superman() {}
Superman.prototype = Hero.prototype

Mais ce que cela fait, c’est que cela rend juste Superman et Hero égaux. Ce dont nous avons réellement besoin est un nouvel objet basé sur le prototype Hero. Depuis ES5, JavaScript dispose d’une fonction intégrée appelée Object.create(). Utilisons-la ici comme indiqué ci-dessous :

Superman.prototype = Object.create(Hero.prototype);

Cela va créer un nouvel objet vide qui est basé sur le prototype Hero et l’assigner au prototype Superman. Donc toutes les propriétés que nous avons dans le prototype Hero peuvent maintenant être accédées par le prototype Superman. Ainsi, au lieu d’appeler new Hero, nous pouvons appeler new Superman et tout fonctionnera toujours comme il se doit.

Mais si vous regardez de plus près la sortie, vous remarquerez qu’il y a un undefined à l’intérieur. C’est parce qu’actuellement le Hero est un constructeur uniquement pour lui-même. Nous devons call les propriétés de Hero à l’intérieur du Superman prototype.

function Superman() {
Hero.call(this, 'Superman', 'Clark Kent', 'Krypton')
}

Créons un autre constructeur appelé MarvelMovies comme indiqué ci-dessous:

function MarvelMovies(movieName, releaseYear) {
this.movieName = movieName;
this.releaseYear = releaseYear;
}

Lorsqu’une fonction est utilisée comme constructeur, this se réfère au nouvel objet que nous créons. Ainsi, dans ce constructeur, j’ai pris movieName et releaseYear comme arguments et j’ai assigné ces valeurs aux propriétés movieName et releaseYear de notre nouvelle instance MarvelMovies nommée avengers.

var avengers = new MarvelMovies("avengers", 2012);

Je vais ensuite créer une nouvelle méthode appelée output pour ce prototype comme indiqué ci-dessous :

MarvelMovies.prototype.output = function() {
return "Movie: " + this.movieName + " Released in " + this.releaseYear;
}
console.log(avengers.output());

Héritage futur

Un aspect vraiment génial de l’héritage est que JavaScript vous permet de modifier ou d’étendre les caractéristiques d’une classe même après l’avoir définie.

JavaScript consultera le prototype lorsqu’il essaiera d’accéder aux propriétés d’un objet. Ainsi, vous pouvez modifier les classes au moment de l’exécution !

Pour illustrer cela, créons un tableau comme indiqué ci-dessous :

var numbers = ;
Array.prototype.shuffle = function() {
return this.sort(function() {
return Math.round( Math.random() * 2) - 1;
});
};
console.log(numbers.shuffle());

Ici, le tableau numbers existait avant le Array.prototype.shuffle. Mais en JavaScript, les recherches de propriétés remontent la chaîne des prototypes. C’est pourquoi le tableau obtient toujours l’accès à la nouvelle méthode shuffle, puisqu’il existe sur le Array.prototype lorsque nous essayons réellement de l’utiliser.

En termes simples, nous avons créé un tableau, puis nous sommes revenus en arrière et avons donné à tous les tableaux l’accès à une nouvelle méthode.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée.