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.
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.
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.