prototype
est créée lorsqu'une fonction est déclarée.
Par exemple :
function Person(dob){
this.dob = dob
};
Person.prototype
est créée en interne une fois que vous avez déclaré la fonction ci-dessus. De nombreuses propriétés peuvent être ajoutées à la fonction Person.prototype
qui sont partagées par Person
créées à l'aide de new Person()
.
// adds a new method age to the Person.prototype Object.
Person.prototype.age = function(){return date-dob};
Il convient de noter que Person.prototype
est un Object
par défaut (il peut être modifié si nécessaire).
Chaque instance créée à l'aide de new Person()
a un __proto__
qui pointe vers la propriété Person.prototype
. C'est la chaîne que l'on traverse pour trouver une propriété d'un objet particulier.
var person1 = new Person(somedate);
var person2 = new Person(somedate);
crée 2 instances de Person
ces 2 objets peuvent appeler age
méthode de Person.prototype
como person1.age
, person2.age
.
Dans l'image ci-dessus de votre question, vous pouvez voir que Foo
est un Function Object
et donc il a un __proto__
lien vers le Function.prototype
qui est à son tour une instance de Object
et dispose d'un __proto__
lien vers Object.prototype
. Le lien proto se termine ici avec __proto__
dans le Object.prototype
pointant vers null
.
Tout objet peut avoir accès à toutes les propriétés de sa chaîne de proto liées par __proto__
et constitue ainsi la base de l'héritage prototypique.
__proto__
n'est pas un moyen standard d'accéder à la chaîne de prototypes, l'approche standard mais similaire consiste à utiliser la fonction Object.getPrototypeOf(obj)
.
Le code ci-dessous pour instanceof
opérateur permet de mieux comprendre :
objet instanceof
L'opérateur de classe retourne true
lorsqu'un objet est une instance d'une Classe, plus précisément si Class.prototype
se trouve dans la chaîne proto de cet objet, alors l'objet est une instance de cette classe.
function instanceOf(Func){
var obj = this;
while(obj !== null){
if(Object.getPrototypeOf(obj) === Func.prototype)
return true;
obj = Object.getPrototypeOf(obj);
}
return false;
}
La méthode ci-dessus peut être appelée comme : instanceOf.call(object, Class)
qui renvoie vrai si l'objet est une instance de Class.
16 votes
Voir aussi Comment
__proto__
diffèrent deconstructor.prototype
?5 votes
Je pense que l'approche descendante ou ascendante est une question de préférence. En fait, je préfère cette façon de faire, car je peux suivre le diagramme jusqu'à ce que je trouve l'origine d'un élément.
2 votes
J'aime comment JavaScript utilise l'héritage prototypique pour résoudre y.constructor en y.__proto__.constructor. J'aime aussi la façon dont Object.prototype se trouve au sommet de la chaîne d'héritage prototypique avec Object.prototype.__proto__ défini à null. J'aime aussi la façon dont le diagramme fait une visualisation conceptuelle en trois colonnes de la façon dont le programmeur pense aux objets comme 1. instances, 2. constructeurs, 3. prototypes que les constructeurs associent à ces instances lorsqu'ils sont instanciés via le mot-clé new.
0 votes
Le diagramme prend tout son sens après avoir regardé quelque chose comme youtube.com/watch?v=_JJgSbuj5VI à propos
0 votes
Et maintenant, après avoir lu les réponses, je me sens obligé de vraiment Je vous recommande la vidéo ci-dessus, car elle donne une explication claire et nette (et non farfelue) de ce qui se passe :)
0 votes
Ce site outil analyse la plupart des structures JavaScript que vous lui présentez en cours d'exécution :)