Comment comprendre le prototype et la chaîne de prototypes en 2023

1. Quelle est la relation cachée entre prototype et __proto__ ?

Lorsqu'il s'agit d'objets prototypes, il doit y avoir plusieurs concepts :
prototype, __proto__, constructeur.

Expliquez d'abord ce qu'est un prototype, un objet prototype. Un objet intégré à toutes les fonctions par le moteur V8. C'est-à-dire tant qu'une fonction est créée (la classe est également comptée, car l'essence de la classe est aussi une fonction). Ensuite, cette fonction portera un prototype d'objet prototype.

Parlons de __proto__, que ce soit une fonction ou un objet, il a l'attribut __proto__. Maintenant, laissez-moi vous apporter une formule universelle très puissante pour illustrer la relation entre __proto__ et prototype

Peu importe le __proto__ d'une fonction ou d'un objet, il doit être équivalent à l'objet prototype de la classe instanciée correspondante.

201504141249489350_c_w_600.jpg

Que voulez-vous dire, laissez-moi vous donner un exemple:

function People(name){
    
    
  this.name = name
}
let p1 = new People();

let arr = new Array();
let obj = new Object();

J'ai maintenant trois paires, p1 (instancié via la classe People), arr (instancié via la classe Array), obj (instancié via la classe Object).

Alors je peux dire :

p1.__proto__ === People.prototype;
arr.__proto__ === Array.prototype;
obj.__proto__ === Object.prototype;

Alors quelqu'un dira, vous n'êtes pas exhaustif. Non seulement les objets ont l'attribut __proto__ ; comment calculer le __proto__ de la fonction ?

OK, pour la classe People ci-dessus, si je l'écris d'une manière différente ! ! ! ! ! comme suit:

let People = new Function('name','this.name = name')

C'est transparent d'un coup, et c'est parfait. On peut dire que People est instancié via la classe Function, donc ! ! !

People.__proto__ === Function.prototype;
Array.__proto__ === Function.prototype;
Object.__proto__ === Function.prototype;

Outre l'instanciation d'objets et de fonctions, y a-t-il autre chose qui a un attribut __proto__ ?

Un autre cas particulier est le prototype. On sait que l'objet prototype est sorti par V8 lors de la création de la fonction, mais qui le sort ? L'objet prototype est l'objet prototype, l'objet prototype est toujours l'objet et l'objet est instancié à partir de l'objet, donc :

People.prototype.__proto__ === Object.prototype

Si vous le poussez ici, vous constaterez que si Object.prototype pointe également vers l'objet prototype de Object. Ensuite, la chaîne prototype est sans tête, donc :

Object.prototype.__proto__ === null

Maintenant, pour la chaîne prototype et l'objet prototype, c'est très transparent. Accédez à la console et essayez-le, rappelez-vous la formule la plus importante ci-dessus :

Peu importe le __proto__ d'une fonction ou d'un objet, il doit être équivalent à l'objet prototype de la classe instanciée correspondante ! ! !

2. Quel type d'avion le constructeur fabrique-t-il ici ?

Pour le constructeur et le prototype, la relation entre __proto__. Il n'est pas possible de trouver une formule plus claire comme ci-dessus.

u=162216898,2553278571&fm=253&fmt=auto&app=138&f=JPEG.webp
Par conséquent, nous énumérons ici la correspondance entre le constructeur de différentes choses et le prototype ou __proto__ de différentes choses pour différentes situations. Quoi qu'il en soit, pas grand-chose, rappelez-vous-en brièvement.

(1) Le constructeur de l'objet :

Le constructeur d'un objet est équivalent à, correspondant à la classe instanciée elle-même :
[].constructor === Array

(2) Le constructeur de la fonction :

Le constructeur d'une fonction est équivalent à, Function :
Array.constructor === Function

(3)constructeur de prototype

Le constructeur du prototype est équivalent à la fonction correspondante elle-même :
Array.prototype.constructor === Array

(4)__proto__的constructeur

Le constructeur de __proto__ est équivalent à la classe instanciée correspondante elle-même :
[].__proto__.constructor === Array

Pour la formule ci-dessus, n'en arrivez pas à une relation d'équivalence mathématique. Par exemple, dès les articles premier et quatrième, vous arrivez à une loi commutative :
[] === [].__proto__
ce n'est pas un échange, cela ne peut que montrer que les deux partagent un constructeur, et cela ne veut pas dire que les deux sont la même chose.

Je suppose que tu aimes

Origine blog.csdn.net/weixin_46726346/article/details/131284088
conseillé
Classement