Maison >interface Web >js tutoriel >Notes d'étude Javascript - Objets (2) : Objet prototype_Connaissances de base
Javascript est le seul langage avec un héritage prototypique largement utilisé, il faut donc du temps pour comprendre les différences entre les deux méthodes d'héritage.
La première différence majeure est que Javascript utilise des chaînes de prototypes pour l'héritage :
function Foo() { this.value = 42; } Foo.prototype = { method: function() {} }; function Bar() {}
Définissez le prototype de Bar sur une instance d'objet de Foo :
Bar.prototype = new Foo(); Bar.prototype.foo = 'Hello World';
Assurez-vous que le constructeur de Bar est lui-même et créez une nouvelle instance d'objet Bar :
Bar.prototype.constructor = Bar; var test = new Bar();
Jetons un coup d'oeil à la composition de l'ensemble de la chaîne de prototypes :
test [instance of Bar] Bar.prototype [instance of Foo] { foo: 'Hello World' } Foo.prototype { method: ... } Object.prototype { toString: ... /* etc. */ }
Dans l'exemple ci-dessus, le test d'objet héritera à la fois de Bar.prototype et de Foo.prototype. Il a donc accès à la méthode fonction définie dans Foo. Bien entendu, il peut également accéder à la valeur de la propriété. Il convient de mentionner que lorsque new Bar() est appelé, il ne crée pas une nouvelle instance Foo, mais réutilise l'instance Foo fournie avec son objet prototype. De même, toutes les instances Bar partagent la même propriété value. Donnons un exemple :
test1 = new Bar(); test2 = new Bar(); Bar.prototype.value = 41; test1.value //41 test2.value//41
Mécanisme de recherche de chaîne de prototypes
Lors de l'accès à une propriété d'un objet, Javascript parcourra toute la chaîne de prototypes en commençant par l'objet lui-même jusqu'à trouver la propriété correspondante. Si le sommet de la chaîne de prototypes est atteint à ce moment-là, qui est Object.prototype dans l'exemple ci-dessus, et que la propriété à trouver n'est toujours pas trouvée, alors Javascript renverra une valeur non définie.
Propriétés de l'objet prototype
Bien que les propriétés de l'objet prototype soient utilisées par Javascript pour construire la chaîne de prototypes, nous pouvons toujours lui attribuer des valeurs. Mais copier la valeur originale dans le prototype n'est pas valide, par exemple :
function Foo() {} Foo.prototype = 1; // no effect
Voici une digression de cet article, présentant quelle est la valeur d'origine :
En Javascript, les variables peuvent stocker deux types de valeurs, à savoir les valeurs primitives et les valeurs de référence.
1.Valeur primitive :
Les valeurs primitives sont des valeurs fixes et simples, qui sont de simples segments de données stockés dans la pile, c'est-à-dire que leurs valeurs sont stockées directement à l'emplacement où l'on accède à la variable.
Il existe cinq types primitifs : Indéfini, Null, Booléen, Nombre et Chaîne.
2. Valeur de référence :
La valeur de référence est un objet relativement volumineux, qui est stocké dans le tas. En d'autres termes, la valeur stockée dans la variable est un pointeur pointant vers la mémoire où l'objet est stocké. Tous les types de référence sont intégrés à partir d'Object.
Problèmes de performances de la chaîne de prototypes
Si la propriété à rechercher est située à l'extrémité supérieure de la chaîne des prototypes, alors le processus de recherche aura sans aucun doute un impact négatif sur les performances. Ce sera un facteur important à prendre en compte dans les scénarios où les exigences de performance sont nécessairement strictes. De plus, essayer de trouver une propriété qui n'existe pas traversera toute la chaîne de prototypes.
De même, lors du parcours des propriétés d'un objet, toutes les propriétés de la chaîne de prototypes seront accessibles.
Résumé
Comprendre l'héritage prototypique est une condition préalable à l'écriture de code Javascript plus complexe. En même temps, faites attention à la hauteur de la chaîne de prototypes dans le code. Apprenez à diviser la chaîne de prototypes lorsque vous êtes confronté à des goulots d'étranglement en termes de performances. De plus, le prototype objet prototype et le prototype __proto__ doivent être distingués. Le prototype objet prototype est principalement abordé ici et les problématiques concernant le prototype __proto__ ne seront pas développées
.