J'ai donc cessé de traîner mes pieds toutes ces années et j'ai décidé d'apprendre le JavaScript "correctement". L'un des éléments les plus géniaux de la conception des langues est l'implémentation de l'héritage. Ayant de l'expérience dans Ruby, j'étais vraiment heureux de voir des fermetures et des dactylographies dynamiques; mais pour la vie de moi ne peut pas comprendre quels avantages doivent être tirés des instances d'objets en utilisant d'autres instances pour l'héritage.
Réponses
Trop de publicités?Permettez-moi de réellement répondre à la question en ligne.
L'héritage de Prototype a les vertus suivantes:
- Il est mieux adapté à la dynamique des langues parce que l'héritage est aussi dynamique que l'environnement, il est en. (L'applicabilité de JavaScript devrait être évident ici.) Cela vous permet de faire des choses rapidement à la volée, comme la personnalisation des classes, sans d'énormes quantités de code d'infrastructure.
- Il est plus facile de mettre en œuvre un prototype de l'objet système que le classique de la classe/objet dichotomie régimes.
- Il élimine le besoin pour le complexe d'arêtes vives autour de l'objet modèle comme "metaclasses" (je n'ai jamais métaclasse j'ai aimé... désolé!) ou "valeurs propres".
Il a cependant les inconvénients suivants:
- Vérifier le Type d'un prototype de la langue n'est pas impossible, mais c'est très, très difficile. La plupart de type "vérification" de prototypiques langues est un pur moment de l'exécution "duck typing"-les chèques de style. Ce n'est pas adapté à tous les environnements.
- De même, il est difficile de faire des choses comme l'optimisation de la répartition de méthode statique (ou, souvent, la même dynamique!) de l'analyse. Il peut (je stress: peut) être très inefficace très facilement.
- De même, la création d'un objet peut être (et est) beaucoup plus lent dans un prototype de langage qu'il peut être de manière plus classique en classe/objet de la dichotomie du système.
Je pense que vous pouvez lire entre les lignes ci-dessus et de venir avec les avantages et les inconvénients de la traditionnelle classe/objet de régimes. Il y a, bien sûr, de plus en plus dans chaque domaine, donc je vais laisser le reste à d'autres gens à y répondre.
IMO le principal avantage de prototypes héritage est sa simplicité.
Les prototypes de la nature de la langue peut confondre les gens qui sont classiquement formés, mais il s'avère qu'en fait il est vraiment simple et puissant concept, héritage différentielle.
Vous n'avez pas besoin de faire de la classification, votre code est plus petit, moins redondants, les objets héritent d'autres, plus général, plus les objets.
Si vous pensez que fait vous remarquerez très vite que vous n'avez pas besoin d'un cours...
Prototypes héritage sera de plus en plus populaire dans le proche avenir, l' ECMAScript 5ème Édition de la spécification introduit l' Object.create
méthode, qui permet de produire une nouvelle instance de l'objet qui hérite de l'autre d'une manière très simple:
var obj = Object.create(baseInstance);
Cette nouvelle version de la norme est en cours de mise en œuvre par tous les éditeurs de navigateurs, et je pense que nous allons commencer à voir plus pure prototypes d'héritage...
Il n'y a vraiment pas beaucoup de choix entre les deux méthodes. L'idée de base pour comprendre, c'est que lorsque le moteur JavaScript est donnée une propriété d'un objet à lire, il vérifie d'abord l'instance et si cette propriété est manquant, il vérifie la chaîne de prototype. Voici un exemple qui montre la différence entre les prototypes et classique:
Prototypes
var single = { status: "Single" },
princeWilliam = Object.create(single),
cliffRichard = Object.create(single);
console.log(Object.keys(princeWilliam).length); // 0
console.log(Object.keys(cliffRichard).length); // 0
// Marriage event occurs
princeWilliam.status = "Married";
console.log(Object.keys(princeWilliam).length); // 1 (New instance property)
console.log(Object.keys(cliffRichard).length); // 0 (Still refers to prototype)
Classique avec des méthodes d'instance (Inefficace, parce que chaque instance stocke ses propres biens)
function Single() {
this.status = "Single";
}
var princeWilliam = new Single(),
cliffRichard = new Single();
console.log(Object.keys(princeWilliam).length); // 1
console.log(Object.keys(cliffRichard).length); // 1
Efficace classique
function Single() {
}
Single.prototype.status = "Single";
var princeWilliam = new Single(),
cliffRichard = new Single();
princeWilliam.status = "Married";
console.log(Object.keys(princeWilliam).length); // 1
console.log(Object.keys(cliffRichard).length); // 0
console.log(cliffRichard.status); // "Single"
Comme vous pouvez le voir, puisqu'il est possible de manipuler le prototype de "classes", a déclaré dans le style classique, il n'y a vraiment aucun avantage à l'aide de prototypes de l'héritage. C'est un sous-ensemble de la méthode classique.
Développement Web: Prototypes Héritage vs Classique Héritage
http://chamnapchhorn.blogspot.com/2009/05/prototypal-inheritance-vs-classical.html
Classique Vs prototypes de l'héritage - Débordement de Pile
http://stackoverflow.com/questions/1450582/classical-vs-prototypal-inheritance