Object
est Eve, et Function
est Adam, Adam ( Function
) utilise son os ( Function.prototype
) pour créer Eve ( Object
). Alors, qui a créé Adam ( Function
)? - L'inventeur du langage JavaScript :-).
Selon la réponse de utsaina, je souhaite ajouter des informations plus utiles.
La chose la plus surprenante pour moi a été de découvrir que cela Object.__proto__
indique Function.prototype
plutôt que Object.prototype
, mais je suis sûr qu'il y a une bonne raison à cela :-)
CA ne devrait pas être. Object.__proto__
ne doit PAS pointer vers Object.prototype
. Au lieu de cela, l'instance de Object
o
, o.__proto__
doit pointer vers Object.prototype
.
(Pardonnez-moi d'utiliser les termes class
et instance
en JavaScript, mais vous le savez :-)
Je pense que la classe Object
elle-même est une instance de Function
, c'est pourquoi Object.__proto__ === Function.prototype
. Par conséquent: Object
est Eve, et Function
est Adam, Adam ( Function
) utilise son os ( Function.prototype
) pour créer Eve ( Object
).
De plus, même la classe Function
elle-même est une instance d' Function
elle-même, c'est-à-direFunction.__proto__ === Function.prototype
-dire aussi pourquoiFunction === Function.constructor
De plus, la classe régulière Cat
est une instance de Function
, c'est-à-dire Cat.__proto__ === Function.prototype
.
La raison de ce qui précède est que lorsque nous créons une classe en JavaScript, en fait, nous créons simplement une fonction, qui devrait être une instance de Function
. Object
et Function
sont juste spéciaux, mais ce sont toujours des classes, alors que Cat
c'est une classe régulière.
En tant que facteur, dans le moteur JavaScript de Google Chrome, les 4 suivants:
Function.prototype
Function.__proto__
Object.__proto__
Cat.__proto__
Ils sont tous ===
(absolument égaux) aux 3 autres, et leur valeur estfunction Empty() {}
> Function.prototype
function Empty() {}
> Function.__proto__
function Empty() {}
> Object.__proto__
function Empty() {}
> Cat.__proto__
function Empty() {}
> Function.prototype === Function.__proto__
true
> Function.__proto__ === Object.__proto__
true
> Object.__proto__ === Cat.__proto__
true
D'ACCORD. Alors, qui crée le spécial function Empty() {}
( Function.prototype
)? Pensez-y :-)