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?

20
demandé sur donut 2011-09-26 21:30:49

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"
                                       }
14
répondu user113716 2011-09-26 18:19:59

un prototype n'est qu'un objet.

c'est tout objet qu'un autre objet utilise comme prototype.

2
répondu timdev 2011-09-26 18:06:37