Quelles sont les méthodes d'héritage en js ?
1 Héritage dans ES6
ES6 utilise le mot-clé class pour définir les classes et le mot-clé extends pour hériter des classes. La méthode super doit être appelée dans le constructeur constructeur de la sous-classe pour obtenir l'objet "this" de la classe parent. Lors de l'appel de super, vous pouvez passer des paramètres au constructeur parent. Les sous-classes peuvent utiliser directement les propriétés et les méthodes de la classe parent via le super objet, ou elles peuvent remplacer les définitions de la classe parent via des propriétés ou des méthodes portant le même nom.
class Father { constructor () { this.surname = '王' this.money = Infinity } sayName () { console.log(`My surname is ${this.surname}.`) } } class Son extends Father { constructor (firstname) { super() this.firstname = firstname } sayName () { console.log(`My name is ${super.surname}${this.firstname}.`) } sayMoney () { console.log(`I have ${this.money} money.`) } } let Sephirex = new Son('撕葱') Sephirex.sayName() Sephirex.sayMoney()
Les classes et l'héritage dans ES6 sont essentiellement du sucre syntaxique implémenté à l'aide de prototypes. Les méthodes définies dans la classe sont équivalentes à la définition de méthodes sur le prototype. Définir des propriétés dans la méthode constructeur est équivalent au mode constructeur. super La méthode équivaut à appeler le constructeur de la classe parent dans la sous-classe. Continuons à discuter de la mise en œuvre de l'héritage dans ES5.
2 Héritage de chaîne de prototypes
Le modèle de base de l'héritage de chaîne de prototypes consiste à laisser l'objet prototype du sous-type pointer vers une instance du type parent, puis à étendre les méthodes pour son prototype.
function Person (name) { this.name = name this.likes = ['apple', 'orange'] } Person.prototype.sayName = function () { console.log(this.name) } function Worker () { this.job = 'worker' } Worker.prototype = new Person() Worker.prototype.sayJob = function () { console.log(this.job) } let Tom = new Worker() let Jerry = new Worker() Tom.likes.push('grape') console.log(Jerry.likes) // [ 'apple', 'orange', 'purple' ]
Principe : Dans l'article précédent, nous avons discuté de __proto__ et de prototype. Il y a un pointeur __proto__ dans l'instance de la sous-classe, qui pointe vers l'objet prototype de son constructeur. Le prototype du constructeur de sous-classe pointe vers une instance de la classe parent, et le __proto__ dans l'instance de la classe parent pointe vers le prototype du constructeur de la classe parent... De cette façon, une chaîne de prototypes est formée.
Il convient de noter que même si l'attribut de type référence dans la classe parent est défini dans le constructeur, il sera toujours partagé par l'instance de classe enfant. En effet, le prototype du constructeur de sous-classe est en fait une instance de la classe parent, donc les propriétés d'instance de la classe parent deviennent naturellement les propriétés du prototype de la sous-classe et les propriétés du prototype des valeurs de type référence sont partagées entre les instances.
Un autre problème avec la chaîne de prototypes est qu'il n'y a aucun moyen de transmettre des paramètres au constructeur de la classe parent sans affecter toutes les instances d'objet. Comme dans l'exemple ci-dessus, lorsque vous utilisez Worker.prototype = new Person() pour pointer le prototype de sous-classe vers l'instance de classe parent, si les paramètres d'initialisation sont transmis, les attributs de nom d'instance de toutes les sous-classes seront les paramètres transmis. Si aucun paramètre n’est transmis ici, il n’y aura aucun moyen de transmettre ultérieurement des paramètres au constructeur de la classe parent. Par conséquent, le modèle d’héritage de chaîne prototype est rarement utilisé seul.
3 Constructeurs emprunteurs
Les constructeurs emprunteurs peuvent résoudre le problème des attributs de type référence partagés. Ce qu'on appelle "emprunter" un constructeur consiste à appeler le constructeur de la classe parent dans le constructeur de la sous-classe - n'oubliez pas que le but de ceci dans la fonction n'a rien à voir avec l'endroit où la fonction est définie, mais seulement avec l'endroit où il est appelé. Nous pouvons utiliser call ou apply pour appeler le constructeur de la classe parent sur l'instance de sous-classe afin d'obtenir les propriétés et les méthodes de la classe parent, de la même manière que l'appel de la super méthode dans le constructeur de sous-classe ES6.
function Person (name) { this.name = name this.likes = ['apple', 'orange'] } function Worker (name) { Person.call(this, name) this.job = 'worker' } let Tom = new Worker('Tom') Tom.likes.push("grape") let Jerry = new Worker('Jerry') console.log(Tom.likes) // [ 'apple', 'orange', 'grape' ] console.log(Jerry.likes) // [ 'apple', 'orange' ]
Le problème avec la simple utilisation du constructeur est que la fonction ne peut pas être réutilisée et que la sous-classe ne peut pas obtenir les attributs et les méthodes sur le prototype de la classe parent.
4 Héritage combiné
L'héritage combiné emprunte des constructeurs pour définir les propriétés de l'instance et utilise des méthodes de partage de chaîne de prototypes. La combinaison de l'héritage combine le mode chaîne de prototypes et le constructeur emprunté, exploitant ainsi les points forts des deux et compensant leurs défauts respectifs. Il s'agit du mode d'héritage le plus couramment utilisé dans js.
function Person (name) { this.name = name this.likes = ['apple', 'orange'] } Person.prototype.sayName = function () { console.log(this.name) } function Worker (name, job) { Person.call(this, name) // 第二次调用 Person() this.job = job } Worker.prototype = new Person() // 第一次调用 Person() Worker.prototype.constructor = Worker Worker.prototype.sayJob = function () { console.log(this.job) } let Tom = new Worker('Tom', 'electrician') Tom.likes.push('grape') console.log(Tom.likes) // [ 'apple', 'orange', 'grape' ] Tom.sayName() // Tom Tom.sayJob() // electrician let Jerry = new Worker('Jerry', 'woodworker') console.log(Jerry.likes) // [ 'apple', 'orange' ] Jerry.sayName() // Jerry Jerry.sayJob() // woodworker
L'héritage combiné n'est pas sans inconvénients, c'est-à-dire que le processus d'héritage appellera deux fois le constructeur de la classe parent. Lorsque le constructeur Person est appelé pour la première fois, Worker.prototype obtiendra deux attributs : name et likes ; lorsque le constructeur Worker est appelé, le constructeur Person sera appelé à nouveau, et cette fois les attributs d'instance name et likes sont directement créés. , couvrant deux propriétés portant le même nom dans le prototype.
5 Héritage prototypique
La fonction objet suivante a été enregistrée dans un article de Douglas Crockford. À l'intérieur de la fonction objet, un constructeur temporaire est d'abord créé, puis l'objet transmis est utilisé comme prototype de ce constructeur, et enfin une nouvelle instance de ce type temporaire est renvoyée. Essentiellement, object() effectue une copie superficielle de l'objet qui lui est transmis. Cette méthode d'héritage équivaut à copier les propriétés et méthodes du type parent vers le sous-type, puis à ajouter les propriétés et méthodes respectives au sous-type.
Cette méthode partagera également les propriétés des valeurs de type référence.
function object(o){ function F(){} F.prototype = o; return new F(); } let Superhero = { name: 'Avenger', skills: [], sayName: function () { console.log(this.name) } } let IronMan = object(Superhero) IronMan.name = 'Tony Stark' IronMan.skills.push('fly') let CaptainAmerica = object(Superhero) CaptainAmerica.name = 'Steve Rogers' CaptainAmerica.skills.push('shield') IronMan.sayName() // Tony Stark console.log(IronMan.skills) // [ 'fly', 'shield' ]
ES5 utilise la méthode Object.create() pour standardiser l'héritage prototypique. Cette méthode accepte deux paramètres : un objet à utiliser comme prototype du nouvel objet et (éventuellement) un objet pour définir des propriétés supplémentaires pour le nouvel objet. Object.create() se comporte de la même manière que la méthode object() lorsqu'un argument est transmis. Le deuxième paramètre de la méthode Object.create() a le même format que le deuxième paramètre de la méthode Object.defineProperties().
let CaptainAmerica = Object.create(Superhero, { name: { value: 'Steve Rogers', configurable: false } })
6 Héritage parasite
L'héritage parasite est facile à comprendre. Il s'agit simplement d'une fonction d'usine qui encapsule le processus d'héritage. Les méthodes étant définies directement sur l'objet, les méthodes ajoutées par héritage parasite ne peuvent pas être réutilisées.
function inherit(parent){ var clone = Object.create(parent) clone.name = 'hulk' clone.sayHi = function(){ console.log("hi") } return clone } let Hulk = inherit(Superhero) Hulk.sayName() // hulk Hulk.sayHi() // hi
7 Héritage combiné parasite
Comme mentionné précédemment, l'héritage combiné est la méthode d'héritage la plus couramment utilisée en js, mais l'inconvénient est que le constructeur de la classe parent sera appelé deux fois . L'héritage compositionnel parasite peut résoudre ce problème et est considéré comme la méthode d'héritage la plus idéale pour les objets contenant des valeurs de type référence.
L'idée de base de l'héritage combiné parasite est qu'il n'est pas nécessaire d'appeler le constructeur de la classe parent pour spécifier le prototype de la sous-classe. Il suffit d'une copie du prototype de la classe parent. . L'héritage compositionnel parasite consiste à hériter de propriétés en empruntant des constructeurs, puis à utiliser l'héritage parasitaire pour hériter du prototype de la classe parent.
function inheritPrototype(subType, superType){ var prototype = Object.create(superType.prototype) prototype.constructor = subType subType.prototype = prototype } function Person (name) { this.name = name this.likes = ['apple', 'orange'] } Person.prototype.sayName = function () { console.log(this.name) } function Worker (name, job) { Person.call(this, name) this.job = job } inheritPrototype(Worker, Person) Worker.prototype.sayJob = function () { console.log(this.job) }
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Outils d'IA chauds

Undresser.AI Undress
Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover
Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool
Images de déshabillage gratuites

Clothoff.io
Dissolvant de vêtements AI

Video Face Swap
Échangez les visages dans n'importe quelle vidéo sans effort grâce à notre outil d'échange de visage AI entièrement gratuit !

Article chaud

Outils chauds

Bloc-notes++7.3.1
Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise
Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1
Puissant environnement de développement intégré PHP

Dreamweaver CS6
Outils de développement Web visuel

SublimeText3 version Mac
Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Sujets chauds

Dans l'héritage de fonction, utilisez le « pointeur de classe de base » et le « pointeur de classe dérivée » pour comprendre le mécanisme d'héritage : lorsque le pointeur de classe de base pointe vers l'objet de classe dérivé, une transformation ascendante est effectuée et seuls les membres de la classe de base sont accessibles. Lorsqu’un pointeur de classe dérivée pointe vers un objet de classe de base, une conversion vers le bas est effectuée (dangereuse) et doit être utilisée avec prudence.

Tutoriel JavaScript : Comment obtenir le code d'état HTTP, des exemples de code spécifiques sont requis Préface : Dans le développement Web, l'interaction des données avec le serveur est souvent impliquée. Lors de la communication avec le serveur, nous devons souvent obtenir le code d'état HTTP renvoyé pour déterminer si l'opération a réussi et effectuer le traitement correspondant en fonction de différents codes d'état. Cet article vous apprendra comment utiliser JavaScript pour obtenir des codes d'état HTTP et fournira quelques exemples de codes pratiques. Utilisation de XMLHttpRequest

Conseils de débogage des erreurs d’héritage : assurez-vous que les relations d’héritage sont correctes. Utilisez le débogueur pour parcourir le code et examiner les valeurs des variables. Assurez-vous d'utiliser correctement le modificateur virtuel. Examinez le problème des diamants d'héritage causé par l'héritage caché. Recherchez les fonctions virtuelles pures non implémentées dans les classes abstraites.

Explication détaillée de l'héritage de fonction C++ : Maîtriser la relation entre "is-a" et "has-a" Qu'est-ce que l'héritage de fonction ? L'héritage de fonction est une technique en C++ qui associe des méthodes définies dans une classe dérivée à des méthodes définies dans une classe de base. Il permet aux classes dérivées d'accéder et de remplacer les méthodes de la classe de base, étendant ainsi les fonctionnalités de la classe de base. Relations « est-un » et « a-un » Dans l'héritage de fonctions, la relation « est-un » signifie que la classe dérivée est un sous-type de la classe de base, c'est-à-dire que la classe dérivée « hérite » des caractéristiques et du comportement de la classe de base. La relation « possède un » signifie que la classe dérivée contient une référence ou un pointeur vers l'objet de classe de base, c'est-à-dire que la classe dérivée « possède » l'objet de classe de base. SyntaxeVoici la syntaxe permettant d'implémenter l'héritage de fonction : classDerivedClass:pu

L'héritage et le polymorphisme affectent le couplage des classes : l'héritage augmente le couplage car la classe dérivée dépend de la classe de base. Le polymorphisme réduit le couplage car les objets peuvent répondre aux messages de manière cohérente via des fonctions virtuelles et des pointeurs de classe de base. Les meilleures pratiques incluent l'utilisation de l'héritage avec parcimonie, la définition d'interfaces publiques, l'évitement de l'ajout de données membres aux classes de base et le découplage des classes via l'injection de dépendances. Un exemple pratique montrant comment utiliser le polymorphisme et l'injection de dépendances pour réduire le couplage dans une application de compte bancaire.

Introduction à la méthode d'obtention du code d'état HTTP en JavaScript : Dans le développement front-end, nous devons souvent gérer l'interaction avec l'interface back-end, et le code d'état HTTP en est une partie très importante. Comprendre et obtenir les codes d'état HTTP nous aide à mieux gérer les données renvoyées par l'interface. Cet article explique comment utiliser JavaScript pour obtenir des codes d'état HTTP et fournit des exemples de code spécifiques. 1. Qu'est-ce que le code d'état HTTP ? Le code d'état HTTP signifie que lorsque le navigateur lance une requête au serveur, le service

Qu'est-ce que la programmation orientée objet ? La programmation orientée objet (POO) est un paradigme de programmation qui résume les entités du monde réel en classes et utilise des objets pour représenter ces entités. Les classes définissent les propriétés et le comportement des objets, et les objets instancient les classes. Le principal avantage de la POO est qu’elle rend le code plus facile à comprendre, à maintenir et à réutiliser. Concepts de base de la POO Les principaux concepts de la POO incluent les classes, les objets, les propriétés et les méthodes. Une classe est le modèle d'un objet, qui définit ses propriétés et son comportement. Un objet est une instance d’une classe et possède toutes les propriétés et comportements de la classe. Les propriétés sont les caractéristiques d'un objet pouvant stocker des données. Les méthodes sont des fonctions d'un objet qui peuvent opérer sur les données de l'objet. Avantages de la POO Les principaux avantages de la POO sont les suivants : Réutilisabilité : la POO peut rendre le code plus

Interface : une interface de contrat sans implémentation définit un ensemble de signatures de méthodes en Java mais ne fournit aucune implémentation concrète. Il agit comme un contrat qui oblige les classes qui implémentent l'interface à implémenter ses méthodes spécifiées. Les méthodes de l'interface sont des méthodes abstraites et n'ont pas de corps de méthode. Exemple de code : publicinterfaceAnimal{voideat();voidsleep();} Classe abstraite : plan partiellement implémenté Une classe abstraite est une classe parent qui fournit une implémentation partielle dont ses sous-classes peuvent hériter. Contrairement aux interfaces, les classes abstraites peuvent contenir des implémentations concrètes et des méthodes abstraites. Les méthodes abstraites sont déclarées avec le mot-clé abstract et doivent être remplacées par des sous-classes. Exemple de code : publicabstractcla
