Le concept d'héritage js
Les deux méthodes d'héritage suivantes sont couramment utilisées en js :
Héritage de chaîne de prototypes (héritage entre objets)
Héritage de classe (héritage entre constructeurs)
Puisque js n'est pas un langage véritablement orienté objet comme Java, js est basé sur des objets et n'a aucun concept de classes. Par conséquent, si vous souhaitez implémenter l'héritage, vous pouvez utiliser le mécanisme prototype de js ou les méthodes apply et call
Dans les langages orientés objet, nous utilisons des classes pour créer un objet personnalisé. Cependant, tout en js est un objet, alors comment créer un objet personnalisé ? Cela nécessite l'utilisation du prototype js :
Nous pouvons simplement considérer le prototype comme un modèle. Les objets personnalisés nouvellement créés sont tous des copies de ce modèle (prototype) (en fait, pas des copies mais des liens, mais ce lien est invisible. Nouveau Il y a un pointeur __Proto__ invisible à l'intérieur de l'instancié. objet, pointant vers l’objet prototype).
JS peut simuler les fonctions des classes via des constructeurs et des prototypes. De plus, l'implémentation de l'héritage de classe js repose également sur la chaîne de prototypes.
Héritage prototypique et héritage de classe
L'héritage classique appelle le constructeur du supertype à l'intérieur du constructeur du sous-type.
L'héritage de classe strict n'est pas très courant et est généralement utilisé en combinaison :
fonction Sub(){
Super.call(this);
>
Héritage de la chaîne prototype
Pour que la sous-classe hérite des attributs (y compris les méthodes) de la classe parent, vous devez d'abord définir un constructeur. Ensuite, affectez la nouvelle instance de la classe parent au prototype du constructeur. Le code est le suivant :
L'héritage de chaîne de prototype ci-dessus manque un lien, c'est-à-dire Object. Tous les constructeurs héritent de Object. L'héritage des objets se fait automatiquement et ne nécessite pas d'héritage manuel. Alors, quelle est leur affiliation ?
Déterminer la relation entre le prototype et l'instance
La relation entre les prototypes et les instances peut être déterminée de deux manières. Méthodes opérateur instanceof et isPrototypeof() :
Tant qu'il s'agit d'un prototype qui apparaît dans la chaîne de prototypes, on peut dire qu'il s'agit du prototype de l'instance dérivée de la chaîne de prototypes. Par conséquent, la méthode isPrototypeof() retournera également true
.En js, la fonction héritée est appelée le super type (la classe parent, la classe de base est également acceptable), et la fonction héritée est appelée le sous-type (sous-classe, classe dérivée). L'utilisation de l'héritage prototypique pose deux problèmes principaux :
Premièrement, le remplacement littéral du prototype rompra la relation et utilisera le prototype du type référence, et le sous-type ne pourra pas transmettre de paramètres au supertype.
Les pseudo-classes résolvent le problème du partage de références et de l'impossibilité de transmettre des paramètres de super types. Nous pouvons utiliser la technologie des "constructeurs empruntés"
.Constructeur d'emprunt (héritage de classe)
Héritage combiné
L'héritage combiné est une méthode d'héritage couramment utilisée. L'idée derrière elle est d'utiliser la chaîne de prototypes pour hériter des propriétés et des méthodes du prototype, et d'emprunter des constructeurs pour hériter des propriétés d'instance. De cette manière, la réutilisation des fonctions est réalisée en définissant des méthodes sur le prototype, et chaque instance est garantie d'avoir ses propres attributs.
Utilisation de call() : Appelez une méthode d'un objet et remplacez l'objet actuel par un autre objet.
Ce type d'héritage utilise des prototypes pour créer de nouveaux objets basés sur des objets existants sans créer de types personnalisés. C'est ce qu'on appelle l'héritage prototypique
.L'héritage prototypique crée d'abord un constructeur temporaire à l'intérieur de la fonction obj(), puis utilise l'objet entrant comme prototype de ce constructeur, et renvoie enfin une nouvelle instance de ce type temporaire.
Héritage parasitaire
Cette méthode d'héritage combine le modèle d'usine de prototype dans le but d'encapsuler le processus de création.
Petits problèmes d'héritage combiné
L'héritage combiné est le modèle d'héritage le plus couramment utilisé dans js, mais le supertype de l'héritage combiné sera appelé deux fois lors de l'utilisation ; une fois lors de la création du sous-type, et l'autre fois dans le constructeur du sous-type
Le code ci-dessus est l'héritage de combinaison précédent, donc l'héritage de combinaison parasite résout le problème de deux appels.
Héritage combinatoire parasitaire
appelez et postulez
Les fonctions globales apply et call peuvent être utilisées pour changer le pointeur de this dans la fonction, comme suit :
// Définir une variable globale
var fruit = "pomme";
// Personnaliser un objet
var pack = {
fruit : "orange"
};
// Équivalent à window.foo();
foo.apply(window); // "pomme", pour le moment, cela est égal à window
// Ceci dans foo à ce moment === pack
foo.apply(pack); // "orange"