Comment puis-je créer une classe de base abstraite en JavaScript?
Est-il possible de simuler la classe de base abstraite en JavaScript? Quelle est la façon la plus élégante de le faire?
Dire, je veux faire quelque chose comme: -
var cat = new Animal('cat');
var dog = new Animal('dog');
cat.say();
dog.say();
Il devrait de sortie: 'écorce', 'miaou'
Vous devez vous connecter pour publier un commentaire.
Un moyen simple de créer une classe abstraite est ceci:
La
Animal
"classe" et lesay
méthode abstraite.La création d'une instance renvoie une erreur:
C'est la façon dont vous "hériter" de celle-ci:
Dog
semble juste comme ça.Et c'est de cette façon que votre scénario se joue:
Violon ici (regardez la sortie de la console).
class
esVoulez-vous dire quelque chose comme ceci:
whattosay
n'est pas définie dans animaux), et que cette réponse est clairement lui demande si la réponse proposée est ce que l'interlocuteur a été à la recherche pour. Il ne prétend pas donner une solution pour les classes abstraites en javascript. L'interlocuteur n'a pas pris la peine de répondre à moi ou à quelqu'un d'autre donc je n'ai aucune idée si cela a fonctionné pour lui. Je suis désolé si un enfant de cinq ans proposé de répondre à quelqu'un elses question n'est pas de travailler pour vous.JavaScript Classes et Héritage (ES6)
Selon ES6, vous pouvez utiliser JavaScript classes et l'héritage d'accomplir ce que vous avez besoin.
Référence: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Classes
Tout d'abord, nous définissons notre classe abstraite. Cette classe ne peut pas être instanciée, mais il peut être prolongé.
Nous pouvons également définir des fonctions qui doivent être mis en œuvre dans toutes les classes, qui s'étend de celui-ci.
Après cela, nous pouvons créer nos Classes concrètes. Ces classes héritent de toutes les fonctions et du comportement de la classe abstraite.
Et les résultats...
Vous pourriez vouloir vérifier Dean Edwards Classe de Base: http://dean.edwards.name/weblog/2006/03/base/
Sinon, il y a cet exemple /article par Douglas Crockford sur la classique héritage en JavaScript: http://www.crockford.com/javascript/inheritance.html
Certainement. Il y a environ mille et une façons de mettre en œuvre la classe/instance systèmes en JavaScript. En voici une:
Ce n'est pas vraiment une classe de base abstraite de cours. Voulez-vous dire quelque chose comme:
Ce n'est pas garanti de fonctionner comme
__proto__
n'est pas une variable standard, mais il fonctionne au moins dans Firefox et Safari.Si vous ne comprenez pas comment il fonctionne, lire sur la chaîne de prototype.
setPrototypeOf
méthode encore dont j'aurais besoin pour mon code.Vous pouvez créer des classes abstraites en utilisant des prototypes d'objets, un exemple simple peut être comme suit :
Vous pouvez changer la méthode ci-dessus ou pas, c'est à vous lorsque vous la mettre en œuvre. Pour une observation détaillée, vous pouvez visiter ici.
Question est assez vieux, mais j'ai créé une certaine solution possible comment créer résumé de "classe" et de bloquer la création d'un objet de ce type.
JS:
Comme Vous pouvez le voir le dernier objet de nous donner l'erreur, c'est parce que les Animaux à l'état de prototype a bien
abstract
. Pour être sûr qu'il est Animal n'est pas quelque chose qui aAnimal.prototype
dans la chaîne de prototype, je n':Donc je vérifier que mon plus proche du prototype de l'objet a
abstract
de propriété, seul objet créé directement à partir deAnimal
prototype aura cette condition sur la valeur true. FonctionhasOwnProperty
vérifie uniquement les propriétés de l'objet courant pas de ses prototypes, donc cela nous donne à 100% sûr que la propriété est déclarée ici, pas dans la chaîne de prototype.Dans ma proposition de nous de ne pas avoir à changer
constructor
à chaque fois aprèsObject.create
comme c'est actuellement la meilleure réponse par @Jordão.Solution permet aussi de créer plusieurs classes abstraites dans la hiérarchie, nous avons seulement besoin de créer
abstract
de la propriété à l'état de prototype.Une autre chose que vous pourriez vouloir faire respecter est de s'assurer que votre classe abstraite n'est pas instancié. Vous pouvez le faire en définissant une fonction qui agit comme un DRAPEAU celles que la classe Abstraite constructeur. Ce sera alors essayez de construire le DRAPEAU qui va appeler son constructeur contenant de l'exception levée. L'exemple ci-dessous:
})()
Javascript peut avoir de l'héritage, consultez l'URL ci-dessous:
http://www.webreference.com/js/column79/
Andrew
Nous pouvons utiliser
Factory
modèle de conception dans ce cas. Javascript utiliserprototype
d'hériter d'un parent est les membres.Définir le constructeur de la classe parent.
Et ensuite créer des enfants de la classe.
Puis de définir la classe des enfants constructeur.
Tester.
Voici la Codepen lien pour l'exemple complet de codage.
Je pense que Toutes Ces réponses spécialement deux premières (par certains et jordão) répondre à la question clairement avec les classiques prototype de la base de JS concept.
Maintenant que vous souhaitez l'animal le constructeur de la classe à se comporter selon les passées en paramètre à la construction, je pense que c'est très semblable au comportement de base de
Creational Patterns
par exemple Modèle De Fabrique.Ici j'ai fait un peu de l'approche pour le faire fonctionner de cette façon.
Animal
constructeur peut être vu comme un anti-modèle, une super-classe ne devrait pas avoir des connaissances sur les sous-classes. (viole de Liskov et Ouvrir/Fermer le principe)Si vous voulez vous assurer que votre base de classes et leurs membres sont strictement résumé ici est une classe de base qui fait cela pour vous:
Mode Strict rend impossible le journal de l'appelant dans la throwAbstract méthode, mais l'erreur doit se produire dans un environnement de débogage de faire apparaître la trace de la pile.