Maison interface Web js tutoriel Résumé de 9 méthodes d'implémentation de l'héritage dans les compétences JavaScript_javascript

Résumé de 9 méthodes d'implémentation de l'héritage dans les compétences JavaScript_javascript

May 16, 2016 pm 03:58 PM
javascript 方式 继承

Contrairement aux langages de programmation basés sur des classes tels que C et Java, l'héritage en JavaScript est basé sur des prototypes. Dans le même temps, JavaScript étant un langage très flexible, il existe de nombreuses façons d’implémenter l’héritage.

Le premier concept de base concerne les constructeurs et les chaînes de prototypes. Le constructeur de l'objet parent s'appelle Parent, le constructeur de l'objet enfant s'appelle Child et les objets parent et enfant correspondants sont respectivement parent et enfant.

Il y a un attribut caché [[prototype]] (attention pas prototype) dans l'objet. Dans Chrome, il s'agit de __proto__, mais dans certains environnements, il est inaccessible. Lors de l'accès aux propriétés ou aux méthodes d'un objet, toutes les propriétés de l'objet seront recherchées en premier. Si elles ne sont pas trouvées, les propriétés de l'objet prototype seront recherchées étape par étape le long de la chaîne de prototypes selon [[prototype]] jusqu'à ce qu'elles soient trouvées. Sinon, retournez undéfini.

1. Héritage de la chaîne prototype :

La chaîne de prototypes est le moyen par défaut d'implémenter l'héritage en JavaScript. Si vous souhaitez qu'un objet enfant hérite de l'objet parent, le moyen le plus simple est de pointer l'attribut prototype du constructeur de l'objet enfant vers une instance de l'objet parent :

Copier le code Le code est le suivant :

fonction Parent() {}
fonction Enfant() {}
Enfant.prototype = nouveau Parent()

À l'heure actuelle, l'attribut prototype de Child a été réécrit et pointe vers un nouvel objet, mais l'attribut constructeur de ce nouvel objet ne pointe pas correctement vers Child. Le moteur JS ne terminera pas automatiquement ce travail pour nous, ce qui nous oblige à le faire manuellement. La propriété constructeur de l'objet prototype de Child renvoie à Child :
Copier le code Le code est le suivant :

Enfant.prototype.constructor = Enfant

Ce qui précède est le mécanisme d'héritage par défaut en JavaScript, qui migre les propriétés et les méthodes qui doivent être réutilisées vers l'objet prototype et définit les parties non réutilisables comme propriétés propres de l'objet. Cependant, cette méthode d'héritage nécessite une nouvelle instance comme propriété. objet prototype, qui est efficace. Il sera inférieur.

2. Héritage prototypique (chaîne non prototype) :

Afin d'éviter le problème de la création répétée d'instances d'objet prototype dans la méthode précédente, vous pouvez directement pointer le prototype du constructeur d'objet enfant vers le prototype du constructeur d'objet parent de cette manière, toutes les propriétés et méthodes de Parent. .prototype peut également être réutilisé. En même temps, il n'est pas nécessaire de créer à plusieurs reprises des instances d'objet prototype :
.

Copier le code Le code est le suivant :

Enfant.prototype = Parent.prototype
Enfant.prototype.constructor = Enfant

Mais nous savons qu'en JavaScript, les objets existent en tant que types référence. Cette méthode pointe en fait les pointeurs enregistrés dans Child.prototype et Parent.prototype vers le même objet. Par conséquent, lorsque nous voulons utiliser le prototype d'objet enfant si vous étendez certaines propriétés dans. Afin de continuer l'héritage plus tard, le prototype de l'objet parent sera également réécrit, car il n'y a toujours qu'une seule instance de l'objet prototype ici, ce qui est aussi le défaut de cette méthode d'héritage.

3. Héritage temporaire du constructeur :

Afin de résoudre le problème ci-dessus, vous pouvez utiliser un constructeur temporaire pour agir comme couche intermédiaire. Toutes les opérations sur le prototype de l'objet enfant sont effectuées sur l'instance du constructeur temporaire et n'affecteront pas le prototype de l'objet parent :

Copier le code Le code est le suivant :

var F = fonction() {}
F.prototype = Parent.prototype
Enfant.prototype = nouveau F()
Enfant.prototype.constructor = Enfant

Dans le même temps, afin d'accéder aux attributs du prototype de classe parent dans l'objet enfant, vous pouvez ajouter un attribut pointant vers le prototype de l'objet parent dans le constructeur de l'objet enfant, tel que uber. De cette manière, l'objet enfant peut. être accessible directement via child.constructor.uber à l'objet prototype parent.

Nous pouvons encapsuler le travail ci-dessus dans une fonction, et appeler cette fonction à l'avenir peut facilement implémenter cette méthode d'héritage :

Copier le code Le code est le suivant :

fonction étendre (Enfant, Parent) {
var F = fonction() {}
F.prototype = Parent.prototype
Enfant.prototype = nouveau F()
Enfant.prototype.constructor = Enfant
Enfant.uber = Parent.prototype
>

Ensuite, vous pouvez l'appeler comme ceci :
Copier le code Le code est le suivant :

étendre(Chien, Animal)

4. Copie d'attribut :

Cette méthode d'héritage ne modifie fondamentalement pas la relation de la chaîne de prototypes, mais copie directement tous les attributs de l'objet prototype parent vers le prototype de l'objet enfant. Bien entendu, la copie ici ne s'applique qu'aux types de données de base et aux types d'objet. ne prend en charge que le passage par référence.

Copier le code Le code est le suivant :

function extend2 (Enfant, Parent) {
var p = Parent.prototype
var c = Enfant.prototype
pour (var je dans p) {
         c[i] = p[i]
>
c.uber = p
>

Cette méthode reconstruit certains attributs du prototype, ce qui sera moins efficace lors de la construction d'objets, mais peut réduire la recherche de la chaîne de prototypes. Cependant, je pense personnellement que les avantages de cette méthode ne sont pas évidents.

5. Héritage entre objets :

En plus de la méthode d'héritage entre constructeurs, vous pouvez également hériter directement entre objets sans constructeurs. Autrement dit, copiez directement les attributs de l'objet, y compris la copie superficielle et la copie approfondie.

Copie superficielle :
Acceptez l'objet à hériter, créez en même temps un nouvel objet vide, copiez les propriétés de l'objet à hériter dans le nouvel objet et renvoyez le nouvel objet :

Copier le code Le code est le suivant :

fonction extendCopy(p) {
var c = {}
pour (var je dans p) {
         c[i] = p[i]
>
c.uber = p
Retour c
>

Une fois la copie terminée, les attributs qui doivent être réécrits dans le nouvel objet peuvent être réécrits manuellement.

Copie approfondie :
Le problème de la copie superficielle est également évident : elle ne peut pas copier les attributs du type d'objet mais ne peut transmettre que la référence. Pour résoudre ce problème, une copie profonde doit être utilisée. L'objectif de la copie profonde réside dans l'appel récursif de copie. Lorsque les propriétés du type d'objet sont détectées, l'objet ou le tableau correspondant est créé et les valeurs du type de base sont copiées une par une.

Copier le code Le code est le suivant :

fonction deepCopy(p, c) {
c = c || pour (var je dans p) {
Si (p.hasOwnProperty(i)) {
Si (typeof p[i] === 'objet') {
                                   c[i] = Array.isArray(p[i]) [] : {}
                 deepCopy(p[i], c[i])
               } autre {
c[je] = p[je]
            }
>
>
Retour c
>

Une méthode ES5 Array.isArray() est utilisée pour déterminer si le paramètre est un tableau. Les environnements qui n'implémentent pas cette méthode doivent encapsuler manuellement une cale.

Copier le code Le code est le suivant :
Array.isArray = fonction(p) {
Renvoie p instance de tableau
>

Cependant, les variables de tableau de différents frameworks ne peuvent pas être jugées à l'aide de l'opérateur instanceof, mais cette situation est relativement rare.

6. Héritage prototype :

A l'aide de l'objet parent, créez un nouvel objet prototypé par l'objet parent via le constructeur :


Copier le code Le code est le suivant :

function object(o) {
    var n
    function F() {}
    F.prototype = o
    n = new F()
    n.uber = o
    return n
}

這裡,直接將父物件設定為子物件的原型,ES5 中的 Object.create()方法就是這種實作方式。

7.原型繼承與屬性拷貝混合:

原型繼承方法中以傳入的父對象為原型建構子對象,同時還可以在父對象提供的屬性之外額外傳入需要拷貝屬性的對象:

複製程式碼 程式碼如下:

function ojbectPlus(o, stuff) {
    var n
    function F() {}
    F.prototype = o
    n = new F()
    n.uber = o

    for (var i in stuff) {
        n[i] = stuff[i]
    }
    return n
}


8.多重繼承:

這種方式不涉及原型鏈的操作,傳入多個需要拷貝屬性的對象,依序進行屬性的全拷貝:

複製程式碼 程式碼如下:

function multi() {
    var n = {}, stuff, i = 0,
        len = arguments.length
    for (i = 0; i         stuff = arguments[i]
        for (var key in stuff) {
            n[i] = stuff[i]
        }
    }
    return n
}

根據物件傳入的順序依序進行拷貝,也就是說,如果後傳入的物件包含和前面物件相同的屬性,後者將會覆寫前者。

9.構造器借用:

JavaScript中的call()和apply()方法非常好用,其改變方法執行上下文的功能在繼承的實作中也能發揮作用。所謂建構子借用是指在子物件建構器中藉用父物件的建構子對this進行操作:

複製程式碼 程式碼如下:

function Parent() {}
Parent.prototype.name = 'parent'

function Child() {
    Parent.apply(this, arguments)
}
var child = new Child()
console.log(child.name)


這種方式的最大優勢就是,在子物件的建構器中,是對子物件的自身屬性進行完全的重建,引用類型的變數也會產生一個新值而不是一個引用,所以對子物件的任何操作都不會影響父對象。

而這種方法的缺點在於,在子物件的建置過程中沒有使用過new操作符,因此子物件不會繼承父級原型物件上的任何屬性,在上面的程式碼中,child的name屬性將會是undefined。

要解決這個問題,可以再次手動將子物件建構器原型設為父物件的實例:

複製程式碼 程式碼如下:

Child.prototype = new Parent()

但這又會帶來另一個問題,即父物件的建構器會被呼叫兩次,一次是在父物件建構器借用過程中,另一次是在繼承原型過程中。

要解決這個問題,就要去掉一次父物件建構器的調用,建構器借用不能省略,那麼只能去掉後一次調用,實現繼承原型的另一方法就是迭代複製:

複製程式碼 程式碼如下:

extend2(Child, Parent)

使用之前實作的extend2()方法即可。
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

AI Hentai Generator

AI Hentai Generator

Générez AI Hentai gratuitement.

Article chaud

R.E.P.O. Crystals d'énergie expliqués et ce qu'ils font (cristal jaune)
2 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
Repo: Comment relancer ses coéquipiers
4 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island Adventure: Comment obtenir des graines géantes
4 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
Combien de temps faut-il pour battre Split Fiction?
3 Il y a quelques semaines By DDD

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.

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.

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.

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

L'héritage des fonctions C++ expliqué : Quand l'héritage ne doit-il pas être utilisé ? L'héritage des fonctions C++ expliqué : Quand l'héritage ne doit-il pas être utilisé ? May 04, 2024 pm 12:18 PM

L'héritage de fonctions C++ ne doit pas être utilisé dans les situations suivantes : Lorsqu'une classe dérivée nécessite une implémentation différente, une nouvelle fonction avec une implémentation différente doit être créée. Lorsqu'une classe dérivée ne nécessite pas de fonction, elle doit être déclarée comme une classe vide ou utiliser des fonctions membres de la classe de base privées et non implémentées pour désactiver l'héritage des fonctions. Lorsque les fonctions ne nécessitent pas d'héritage, d'autres mécanismes (tels que des modèles) doivent être utilisés pour réaliser la réutilisation du code.

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

'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

See all articles