Je programme avec des langages OOP depuis plus de 10 ans mais j'apprends maintenant JavaScript et c'est la première fois que je rencontre l'héritage basé sur des prototypes. J'ai tendance à apprendre le plus rapidement en étudiant le bon code. Qu'est-ce qu'un exemple bien écrit d'application (ou bibliothèque) JavaScript qui utilise correctement l'héritage prototypique? Et pouvez-vous décrire (brièvement) comment / où l'héritage prototypique est utilisé, pour que je sache par où commencer la lecture?
javascript
prototypal-inheritance
Alex Reisner
la source
la source
Réponses:
Douglas Crockford a une belle page sur l' héritage prototypique JavaScript :
Les travaux Base.js de Dean Edward , Mootools's Class ou Simple Inheritance de John Resig sont des moyens d' hériter classique en JavaScript.
la source
newObj = Object.create(oldObj);
si vous le souhaitez sans cours? Sinon, remplacer paroldObj
avec l'objet prototype de la fonction constructeur devrait fonctionner?Comme mentionné, les films de Douglas Crockford donnent une bonne explication sur le pourquoi et il couvre le comment. Mais pour le mettre en quelques lignes de JavaScript:
Le problème avec cette approche, cependant, est qu'elle recrée l'objet à chaque fois que vous en créez un. Une autre approche consiste à déclarer vos objets sur la pile de prototypes, comme ceci:
Il y a un léger inconvénient en ce qui concerne l'introspection. Dumping testOne entraînera des informations moins utiles. La propriété privée "privateVariable" dans "testOne" est également partagée dans toutes les instances, également mentionnée utilement dans les réponses de shesek.
la source
privateVariable
est simplement une variable dans la portée de l' IIFE , et qu'elle est partagée entre toutes les instances, vous ne devez donc pas y stocker de données spécifiques à l'instance. (sur testTwo, il est spécifique à l'instance, car chaque appel à testTwo () crée une nouvelle portée par instance)Dog.prototype
. Donc, au lieu d'utiliserthis.bark = function () {...}
, nous pouvons faire enDot.prototype.bark = function () {...}
dehors de laDog
fonction. (Voir plus de détails dans cette réponse )la source
Je jetterais un œil à YUI et à la
Base
bibliothèque de Dean Edward : http://dean.edwards.name/weblog/2006/03/base/Pour YUI, vous pouvez jeter un coup d'œil sur le module lang , esp. la méthode YAHOO.lang.extend . Et puis, vous pouvez parcourir la source de certains widgets ou utilitaires et voir comment ils utilisent cette méthode.
la source
lang
est donc semi-rompu. Quelqu'un veut-il le réparer pour YUI 3?Il existe également la bibliothèque ASP.NET Ajax de Microsoft , http://www.asp.net/ajax/ .
Il existe également de nombreux bons articles MSDN, notamment Créer des applications Web avancées avec des techniques orientées objet .
la source
C'est l'exemple le plus clair que j'ai trouvé, tiré du livre Node de Mixu ( http://book.mixu.net/node/ch6.html ):
la source
ES6
class
etextends
ES6
class
et neextends
sont que du sucre de syntaxe pour une manipulation de chaîne de prototype auparavant possible, et donc sans doute la configuration la plus canonique.En savoir plus sur la chaîne de prototypes et la
.
recherche de propriétés sur: https://stackoverflow.com/a/23877420/895245Maintenant, déconstruisons ce qui se passe:
Diagramme simplifié sans tous les objets prédéfinis:
la source
Je suggère de regarder Class.create de PrototypeJS:
Line 83 @ http://prototypejs.org/assets/2009/8/31/prototype.js
la source
Les meilleurs exemples que j'ai vus sont dans JavaScript de Douglas Crockford : The Good Parts . Cela vaut vraiment la peine d'acheter pour vous aider à avoir une vision équilibrée de la langue.
Douglas Crockford est responsable du format JSON et travaille chez Yahoo en tant que gourou JavaScript.
la source
Il existe un extrait d' héritage basé sur un prototype JavaScript avec des implémentations spécifiques à la version ECMAScript. Il choisira automatiquement laquelle utiliser entre les implémentations ES6, ES5 et ES3 en fonction de l'exécution actuelle.
la source
Ajout d'un exemple d'héritage basé sur un prototype en Javascript.
ES6 utilise une implémentation beaucoup plus simple de l'héritage avec l'utilisation de mots-clés constructeur et super.
la source