JavaScript est le seul langage largement utilisé pour l'héritage des prototypes, 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 hériter:
fonction foo () {this.value = 42;} foo.prototype = {méthode: function () {}}; function bar () {}Définissez le prototype de Bar sur l'instance de l'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'œil à la composition de toute la chaîne prototype:
test [instance de bar] bar.prototype [instance de foo] {foo: 'hello world'} foo.prototype {méthode: ...} object.prototype {toString: ... / * etc. * /}Dans l'exemple ci-dessus, le test d'objet héritera à la fois BAR.prototype et foo.pototype. Par conséquent, il peut accéder à la méthode de fonction définie dans FOO. Bien sûr, il peut également accéder à la valeur de la propriété. Il convient de mentionner que lorsque New Bar () n'est pas créé, une nouvelle instance FOO est réutilisée, mais l'instance FOO qui vient avec son objet prototype. De même, toutes les instances de barre partagent le même attribut de valeur. Donnons des exemples:
test1 = new bar (); test2 = new bar (); Bar.prototype.value = 41; test1.value // 41 test2.value // 41
Mécanisme de recherche de chaîne prototype
Lors de l'accès aux propriétés d'un objet, JavaScript traversera toute la chaîne prototype de l'objet lui-même jusqu'à ce qu'il trouve les propriétés correspondantes. Si vous atteignez le haut de la chaîne prototype, qui est l'objet.pototype dans l'exemple ci-dessus, et toujours aucun attribution à trouver, alors JavaScript renverra la valeur non définie.
Propriétés des objets prototypes
Bien que les propriétés de l'objet prototype soient utilisées par JavaScript pour construire la chaîne prototype, nous pouvons toujours y attribuer des valeurs. Mais la copie de la valeur d'origine au prototype n'est pas valide, comme:
fonction foo () {} foo.prototype = 1; // Aucun effetVoici une distraction de cet article et introduire quelle est la valeur d'origine:
Dans JavaScript, les variables peuvent stocker deux types de valeurs, à savoir la valeur d'origine et la valeur de référence.
1. Valeur primitive:
Les valeurs d'origine sont des valeurs fixes et simples, qui sont des segments de données simples stockés dans la pile, c'est-à-dire que leurs valeurs sont directement stockées à l'emplacement où la variable est accessible.
Il existe cinq types de types primitifs: non définis, nuls, booléens, numéro, chaîne.
2. Valeur de référence:
La valeur de référence est un objet relativement grand, l'objet stocké dans le tas de tas, c'est-à-dire que la valeur stockée à la variable est un pointeur de pointeur pointant vers la mémoire où l'objet est stocké. Tous les types de référence sont intégrés à partir de l'objet.
Problèmes de performances de la chaîne prototype
Si les attributs à trouver sont situés en haut de la chaîne prototype, le processus de recherche aura sans aucun doute un impact négatif sur les performances. Ce sera une considération clé lorsque dans les scénarios où les exigences de performance sont nécessaires. De plus, essayer de trouver une propriété qui n'existe pas traversera toute la chaîne prototype.
De même, lors de la traversée des propriétés d'un objet, toutes les propriétés de la chaîne prototype seront accessibles.
Résumer
Comprendre l'héritage du prototype est la condition préalable pour écrire du code JavaScript plus complexe, et vous devez également prêter attention à la hauteur de la chaîne prototype dans le code. Lorsque vous faites face à des goulots d'étranglement de performance, vous devez apprendre à diviser la chaîne prototype. De plus, pour distinguer le prototype d'objet prototype du prototype __proto__, nous discuterons principalement du prototype d'objet prototype ici, et nous n'expliquerons pas le problème du prototype __proto__.