Table des matières
1 Héritage dans ES6
2 Héritage de chaîne de prototypes
3 Constructeurs emprunteurs
4 Héritage combiné
5 Héritage prototypique
6 Héritage parasite
7 Héritage combiné parasite
Maison interface Web js tutoriel Quelles sont les méthodes d'héritage en js ?

Quelles sont les méthodes d'héritage en js ?

Jun 21, 2017 am 09:57 AM
javascript 继承

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()
Copier après la connexion

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' ]
Copier après la connexion

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' ]
Copier après la connexion

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
Copier après la connexion

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' ]
Copier après la connexion

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
  }
})
Copier après la connexion

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
Copier après la connexion

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)
}
Copier après la connexion

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!

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

Video Face Swap

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 !

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

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

Explication détaillée de l'héritage des fonctions C++ : Comment utiliser le « pointeur de classe de base » et le « pointeur de classe dérivé » dans l'héritage ? Explication détaillée de l'héritage des fonctions C++ : Comment utiliser le « pointeur de classe de base » et le « pointeur de classe dérivé » dans l'héritage ? May 01, 2024 pm 10:27 PM

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 simple : Comment obtenir le code d'état HTTP Tutoriel JavaScript simple : Comment obtenir le code d'état HTTP Jan 05, 2024 pm 06:08 PM

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

Explication détaillée de l'héritage des fonctions C++ : Comment déboguer les erreurs d'héritage ? Explication détaillée de l'héritage des fonctions C++ : Comment déboguer les erreurs d'héritage ? May 02, 2024 am 09:54 AM

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 des fonctions C++ : Comment comprendre la relation « est-un » et « a-un » dans l'héritage ? Explication détaillée de l'héritage des fonctions C++ : Comment comprendre la relation « est-un » et « a-un » dans l'héritage ? May 02, 2024 am 08:18 AM

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

Comment l'héritage et le polymorphisme affectent-ils le couplage de classes en C++ ? Comment l'héritage et le polymorphisme affectent-ils le couplage de classes en C++ ? Jun 05, 2024 pm 02:33 PM

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.

Comment obtenir facilement le code d'état HTTP en JavaScript Comment obtenir facilement le code d'état HTTP en JavaScript Jan 05, 2024 pm 01:37 PM

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

'Introduction à la programmation orientée objet en PHP : du concept à la pratique' 'Introduction à la programmation orientée objet en PHP : du concept à la pratique' Feb 25, 2024 pm 09:04 PM

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

Interfaces Java et classes abstraites : la route vers le paradis de la programmation Interfaces Java et classes abstraites : la route vers le paradis de la programmation Mar 04, 2024 am 09:13 AM

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

See all articles