JavaScript Extension De La Classe
J'ai une classe de base:
function Monster() {
this.health = 100;
}
Monster.prototype.growl = function() {
console.log("Grr!");
}
Que je veux étendre et créer une autre classe avec:
function Monkey extends Monster() {
this.bananaCount = 5;
}
Monkey.prototype.eatBanana {
this.bananaCount--;
this.health++; //Accessing variable from parent class monster
this.growl(); //Accessing function from parent class monster
}
J'ai fait un peu de recherche et il semble y avoir beaucoup de solutions alambiquées pour faire ça en JavaScript. Ce serait la plus simple et la plus fiable de l'accomplissement de cette en JS?
- Double Possible de Comment faire pour hériter d'une classe en javascript?
Vous devez vous connecter pour publier un commentaire.
Mise à jour ci-dessous pour ES6
Mars 2013 et ES5
Ce MDN document décrit l'extension de classes bien:
https://developer.mozilla.org/en-US/docs/JavaScript/Introduction_to_Object-Oriented_JavaScript
En particulier, voici maintenant qu'ils ne l'utilisent:
Noter que
de l'Objet.créer()
est pas pris en charge dans certains anciens navigateurs, y compris IE8:Si vous êtes dans la position d'avoir besoin à l'appui de ces, liés MDN document suggère d'utiliser un polyfill, ou l'approximation suivante:
L'utilisation de ce comme
Student.prototype = createObject(Person.prototype)
est préférable à l'utilisationnew Person()
en ce qu'il évite l'appel de la mère de la fonction constructeur lorsque vous héritez le prototype, et appelle le constructeur parent lorsque l'héritier du constructeur est appelé.Mai 2017 et ES6
Heureusement, le JavaScript, les concepteurs ont entendu nos appels à l'aide et ont adopté une mesure plus appropriée pour aborder cette question.
MDN a un autre excellent exemple sur ES6 l'héritage de classe, mais je vais vous montrer exactement le même jeu de classes comme ci-dessus reproduit dans l'ES6:
Propre et compréhensible, tout comme nous le voulons tous. Gardez à l'esprit que, bien que ES6 est assez commun, c'est pas pris en charge partout:
function Person(n) { this.name = n; }
Student.prototype = new Person();
Cette ligne conduire à une erreur si je accéder à ce paramètre dans la super-classe.Student.prototype = Object.create(Person.prototype);
Classique de la méthode de création des œuvres iciES6 vous donne maintenant la possibilité d'utiliser classe & s'étend mots-clés :
Ensuite , votre code sera :
Vous avez une classe de base:
Que Vous souhaitez étendre et de créer une autre classe avec:
try{}catch(e){}
blocs à gérer ça, & dire à l'utilisateur final de mettre à jour son navigateur si cela est nécessaire.Essayez ceci:
Edit: j'ai mis une rapide démo ici http://jsbin.com/anekew/1/edit. Notez que
extends
est un mot réservé en JS et vous pouvez obtenir des avertissements lorsque peluchage votre code, vous pouvez simplement le nom ilinherits
, c'est ce que je fais d'habitude.Avec ce helper en place et l'utilisation d'un objet
props
comme seul paramètre, l'héritage en JS devient un peu plus simple:Monkey
de ne pas hériter deMonster
's propriétés (health
). Vous obtiendrez également "ReferenceError: le Singe n'est pas défini" siMonkey
n'est pas défini avant d'appelerMonkey.extends(Monster)
Si vous n'aimez pas le prototype de l'approche, car il n'a pas vraiment de se comporter, dans une belle programmation orientée objet-chemin, vous pouvez essayer ceci:
Léger de la bibliothèque (2k minifiés): https://github.com/haroldiedema/joii
Je peux proposer une variante, il suffit d'avoir lu dans le livre, il semble que le plus simple:
C'est une extension (excusez le jeu de mots) de elclanrs solution d'inclure des détails sur les méthodes d'instance, ainsi que la prise d'un extensible à l'approche de cet aspect de la question; je reconnais pleinement que c'est mis en place grâce à David Flanagan "JavaScript: The Definitive Guide" (partiellement ajusté pour ce contexte). Notez que c'est nettement plus détaillé que d'autres solutions, mais qui aurait sans doute avantage à long terme.
D'abord que nous utilisons David est simple "étendre", une fonction qui copie les propriétés d'un objet spécifié:
Ensuite, nous mettons en œuvre sa définition de sous-classe utilitaire:
Pour le dernier bit de la préparation nous permet d'améliorer notre prototype de Fonction avec David le nouveau jiggery-pokery:
Après la définition de notre Monstre de classe, nous faisons le suivant (qui est ré-utilisable pour toutes les nouvelles Classes, nous voulons étendre/inherit):
Traditionnelles de l'extension, vous pouvez simplement écrire comme constructeur de la superclasse de la fonction,
et ensuite appliquer ce constructeur de votre classe héritée.
Exemple sur angularjs:
http://plnkr.co/edit/eFixlsgF3nJ1LeWUJKsd?p=preview
Pour Des Autodidactes:
Créer une "instance" avec getter et setter:
Résumé:
Il existe de nombreuses façons qui peuvent résoudre le problème de l'extension de la fonction constructeur avec un prototype en Javascript. Laquelle de ces méthodes est la "meilleure" solution opinion fondée. Cependant, ici, sont deux méthodes fréquemment utilisées afin de prolonger un constructeur de prototype de fonction.
ES 2015 Classes:
JS:
L'approche ci-dessus de l'aide
ES 2015
classes est rien de plus que du sucre syntaxique sur les prototypes de motif d'héritage en javascript. Voici le premier journal où nous évaluonstypeof Monster
nous pouvons observer que c'est la fonction. C'est parce que les classes sont juste des constructeur fonctions sous le capot. Néanmoins, vous aimerez cette façon de la mise en œuvre de prototypes héritage et définitivement devraient l'apprendre. Il est utilisé dans les grands cadres commeReactJS
etAngular2+
.Usine de fonction à l'aide de
Object.create()
:JS:
Cette méthode utilise la
Object.create()
méthode qui prend un objet qui sera le prototype de l'objet nouvellement créé il retourne. Par conséquent, nous avons d'abord créer l'objet prototype de cette fonction, et ensuite appelerObject.create()
qui retourne un objet vide avec le__proto__
ensemble de propriétés pour le Monstre de l'objet. Après cela, nous pouvons initialiser toutes les propriétés de l'objet, dans cet exemple, nous attribuons au bananacount de l'objet nouvellement créé.absolument minime (et de corriger, à la différence de la plupart des réponses ci-dessus) version:
C'est tout. Vous pouvez lire ici, une longue explication