Quelle est la différence entre un objet et un prototype de prototypes de programmation?
j'essaie de comprendre la "façon JavaScript" de créer et d'utiliser des objets et je pense que je tombe sur une mauvaise compréhension d'un objet et d'un prototype.
dans un nouveau projet que j'ai commencé, j'ai décidé d'essayer l'héritage prototypique. Je suis confus si cela signifie que je dois juste créer un objet que j'ai l'intention d'utiliser et puis créer d'autres objets basés sur cela en utilisant Object.create()
comme:
var labrador = {
color: 'golden',
sheds: true,
fetch: function()
{
// magic
}
};
var jindo = Object.create(dog);
jindo.color = 'white';
Ou si je dois créer une sorte de classe et créer des instances de l'aide Object.create()
.
var Dog = { // Is this class-like thing a prototype?
color: null,
sheds: null,
fetch: function()
{
// magic
}
};
var labrador = Object.create(Dog);
labrador.color = 'golden';
labrador.sheds = true;
var jindo = Object.create(Dog);
jindo.color = 'white';
jindo.sheds = true;
ayant beaucoup plus d'expérience en matière de POO basée sur la classe, cette dernière méthode me semble plus à l'aise (et peut-être que c'est une raison suffisante). Mais je sens que l'esprit de prototypes héritage est plus dans la première option.
la méthode est plus dans "l'esprit" de prototypes de programmation? Ou est-ce que je passe complètement à côté de l'essentiel?
2 réponses
prototype
est juste un autre objet pour lequel un objet a une référence implicite.
Quand tu fais:
var obj = Object.create( some_object );
...vous dites que vous voulez obj
pour essayer de récupérer les propriétés de some_object
, quand ils n'existent pas sur obj
.
en tant que tel, votre second exemple serait plus proche de la façon dont vous l'utiliseriez. Chaque objet qui est créé en utilisant Object.create(Dog)
dans son chaîne prototype, qui Dog
objet. Donc, si vous faites un changement d' Dog
, le changement sera reflété sur tous les objets qui ont Dog
dans la chaîne.
si l'objet principal a la même propriété que celle qui existe sur l'objet prototype, cette propriété est ombrage propriété du prototype. Un exemple de cela serait la null
valeurs que vous définissez les propriétés de Dog
.
Si vous n':
var lab = Object.create(Dog);
lab.color = 'golden';
...tu es maintenant en train de suivre le color
propriété sur Dog
, donc vous ne plus null
. Vous êtes changer Dog
en aucune façon, donc si je crée un autre objet:
var colorless_dog = Object.create(Dog);
...ce sera toujours l' null
valeur de la chaîne prototype lors de l'accès au color
propriété.
colorless_dog.color; // null
...jusqu'à ce que vous l'ombre:
colorless_dog.color = 'blue';
colorless_dog.color; // 'blue'
donc vu votre exemple:
var lab = Object.create(Dog);
lab.color = 'golden';
lab.sheds = true;
...il ressemble à quelque chose comme ceci:
// labrador // Dog
lab.color---> color:'golden' color:null
lab.sheds---> sheds:true sheds:null
lab.fetch()--------------------------> fetch: function() {
alert( this.color ); // 'golden'
// "this" is a reference to the
// "lab" object, instead of "Dog"
}
un prototype n'est qu'un objet.
c'est tout objet qu'un autre objet utilise comme prototype.