Il se trouve que j'apprends un prototype de You Don't Know JS: this & Object Prototypes , qui est un livre merveilleux pour comprendre la conception en dessous et clarifier tant d'idées fausses (c'est pourquoi j'essaie d'éviter d'utiliser l'héritage et des choses comme instanceof
).
Mais j'ai la même question que les personnes posées ici. Plusieurs réponses sont vraiment utiles et instructives. J'aimerais aussi partager mes compréhensions.
Qu'est-ce qu'un prototype?
Les objets en JavaScript ont une propriété interne, notée dans la spécification comme [[Prototype]]
, qui est simplement une référence à un autre objet. Presque tous les objets reçoivent une valeur nonnull
valeur pour cette propriété, au moment de leur création.
Comment obtenir le prototype d'un objet?
via __proto__
ouObject.getPrototypeOf
var a = { name: "wendi" };
a.__proto__ === Object.prototype // true
Object.getPrototypeOf(a) === Object.prototype // true
function Foo() {};
var b = new Foo();
b.__proto__ === Foo.prototype
b.__proto__.__proto__ === Object.prototype
C'est quoi prototype
?
prototype
est un objet créé automatiquement en tant que propriété spéciale d'une fonction , qui est utilisé pour établir la chaîne de délégation (héritage), également appelée chaîne prototype.
Lorsque nous créons une fonction a
, elle prototype
est automatiquement créée en tant que propriété spéciale sur a
et enregistre le code de fonction en tant que constructor
on prototype
.
function Foo() {};
Foo.prototype // Object {constructor: function}
Foo.prototype.constructor === Foo // true
J'adorerais considérer cette propriété comme l'endroit où stocker les propriétés (y compris les méthodes) d'un objet fonction. C'est aussi la raison pour laquelle les fonctions utilitaires dans JS sont définies comme Array.prototype.forEach()
,Function.prototype.bind()
,Object.prototype.toString().
Pourquoi mettre en valeur la propriété d'une fonction ?
{}.prototype // undefined;
(function(){}).prototype // Object {constructor: function}
// The example above shows object does not have the prototype property.
// But we have Object.prototype, which implies an interesting fact that
typeof Object === "function"
var obj = new Object();
Ainsi, Arary
, Function
, Object
sont toutes les fonctions. Je dois admettre que cela rafraîchit mon impression sur JS. Je sais que les fonctions sont des citoyens de première classe dans JS, mais il semble qu'il soit construit sur des fonctions.
Quelle est la différence entre __proto__
etprototype
?
__proto__
une référence fonctionne sur chaque objet pour faire référence à son[[Prototype]]
propriété.
prototype
est un objet créé automatiquement en tant que propriété spéciale d'une fonction , qui est utilisé pour stocker les propriétés (y compris les méthodes) d'un objet fonction.
Avec ces deux, nous pourrions cartographier mentalement la chaîne prototype. Comme cette image illustre:
function Foo() {}
var b = new Foo();
b.__proto__ === Foo.prototype // true
Foo.__proto__ === Function.prototype // true
Function.prototype.__proto__ === Object.prototype // true
__proto__
diffère-constructor.prototype
t-il?