Quel est l'intérêt de la méthode prototype?

10

Je lis à travers Javascript: The Good Parts , et j'ai eu du mal à me familiariser avec la section sur les prototypes .

Après un petit google, je suis arrivé à la conclusion que c'était pour ajouter des propriétés aux objets après la déclaration des objets.

En utilisant ce script luisant de w3schools, j'ai remarqué que la suppression de la ligne ajoutant la propriété prototype n'avait aucun effet . Alors à quoi ça sert?


//Prototyping

function employee(name,jobtitle,born)
{
this.name=name;
this.jobtitle=jobtitle;
this.born=born;
}

var fred=new employee("Fred Flintstone","Caveman",1970);
employee.prototype.salary=null; //  <---  try removing this line
fred.salary=20000;

document.write (fred.salary);

Doux Fuzz
la source
4
@Raynos a bien dit, mais suggère également un remplacement, par exemple MDN docs: developer.mozilla.org/en/JavaScript
StuperUser

Réponses:

13

Ce n'est pas ainsi que fonctionne le prototype. Le prototype est utilisé dans la chaîne de prototypes.

Chaque fois que vous essayez d'obtenir une propriété sur un objet, il vérifiera l'objet pour ce nom de propriété. S'il n'existe pas, il cherchera dans le prototype.

Exemple:

var o = {
  "foo": "bar",
  "method": function() { ... }
};

var o2 = Object.create(o);
var o3 = Object.create(o);

console.log(o2.hasOwnProperty("foo")); // false
console.log(o2.foo); // "bar"
console.log(o2.__proto__ === o); // true
o.baz = "foobar";
console.log(o2.baz); // "foobar"

Le but du prototype est donc simplement la réutilisation et l'héritage du code.

Raynos
la source
D'accord, je comprends cela maintenant. Mais j'ai essayé d'ajouter une propriété dynamiquement, et cela me dit prototype is undefined---o.prototype.newProp = "mutts nuts";
Mild Fuzz
3
@MildFuzz oest un objet. La .prototypepropriété est utilisée sur les fonctions, ignorez-la. o.newProp = "mutts nuts"
Faites
7

Lorsque vous l'avez fait, fred.salary=20000vous n'avez ajouté l'attribut de salaire qu'à fred. Lors de l'utilisation du prototype, tous les employés que vous créerez à partir de ce moment auront l'attribut de salaire.

Supposons que vous ayez 100 instances d'employés et que vous vouliez ajouter un attribut de salaire à chacun d'eux. Vous pouvez le faire manuellement, itérer sur chaque employé et l'ajouter. Ou vous pouvez utiliser le prototype et le définir pour tous.

Le prototype est utile lorsque vous souhaitez utiliser une fonctionnalité sur quelque chose qui existe déjà. Supposons que vous souhaitiez ajouter une méthode personnalisée aux tableaux. Vous feriez quelque chose comme:

Array.prototype.my_custom_method = function() {...}

À partir de là, tous les tableaux que vous créerez auront cette méthode disponible.

adivasile
la source
3
Je suis surpris que personne n'ait mentionné que cela est conçu pour réduire l'utilisation de la mémoire. Si vous devez implémenter un objet complexe qui contient beaucoup de code, vous ne voulez pas que le code soit répété dans chaque instance de l'objet. De toute évidence, les propriétés des données sont plus susceptibles d'être différentes dans chaque instance, mais vous ne voulez généralement qu'une seule copie du code, vous le mettez donc dans le prototype.
Dominic Cronin
1
OMI, c'est de loin la meilleure réponse.
The Muffin Man
5

Vous voudrez peut-être jeter un œil à cet article .

Un langage basé sur un prototype a la notion d'un objet prototypique, un objet utilisé comme modèle à partir duquel obtenir les propriétés initiales d'un nouvel objet. Tout objet peut spécifier ses propres propriétés, soit lors de sa création, soit lors de l'exécution. De plus, tout objet peut être associé en tant que prototype pour un autre objet, permettant au deuxième objet de partager les propriétés du premier objet.

Si vous ajoutez une propriété à un objet utilisé comme prototype pour un ensemble d'objets, les objets pour lesquels il s'agit du prototype obtiennent également la nouvelle propriété.

C'est l'un des principaux avantages d'un langage basé sur un prototype par rapport à un langage basé sur une classe.

En outre, il est facile d'obtenir un héritage OO classique avec JS si vous en avez besoin, mais il est souvent difficile d'obtenir un modèle prototype pour un langage qui ne l'implémente pas par défaut.

Jose Faeti
la source
3
+1 pour l'article sur les langues basées sur les classes et celles basées sur les prototypes
adivasile