Est-il possible de simuler une classe de base abstraite en JavaScript? Quelle est la manière la plus élégante de le faire?
Dites, je veux faire quelque chose comme: -
var cat = new Animal('cat');
var dog = new Animal('dog');
cat.say();
dog.say();
Il devrait afficher: 'bark', 'meow'
javascript
oop
abstract
Sabya
la source
la source
Réponses:
Une façon simple de créer une classe abstraite est la suivante:
La
Animal
"classe" et lasay
méthode sont abstraites.La création d'une instance générerait une erreur:
Voici comment vous en «héritez»:
Dog
lui ressemble.Et voici comment se déroule votre scénario:
Fiddle ici (regardez la sortie de la console).
la source
Classes JavaScript et héritage (ES6)
Selon ES6, vous pouvez utiliser les classes JavaScript et l'héritage pour accomplir ce dont 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 peut être étendue. Nous pouvons également définir des fonctions qui doivent être implémentées dans toutes les classes qui étendent celle-ci.
Après cela, nous pouvons créer nos classes concrètes. Ces classes hériteront de toutes les fonctions et comportements de la classe abstraite.
Et les résultats ...
la source
Voulez-vous dire quelque chose comme ça:
la source
whattosay
n'est pas défini dans l' animal ), et que cette réponse demande clairement si la réponse proposée correspondait à ce que le questionneur recherchait. Il ne prétend pas donner une solution pour les classes abstraites en javascript. Le questionneur n'a pas pris la peine de répondre à moi ou à quelqu'un d'autre, donc je ne sais pas si cela a fonctionné pour lui. Je suis désolé si une réponse proposée par un enfant de cinq ans à une autre question n'a pas fonctionné pour vous.Vous voudrez peut-être consulter la classe de base de Dean Edwards: http://dean.edwards.name/weblog/2006/03/base/
Alternativement, il y a cet exemple / article de Douglas Crockford sur l'héritage classique en JavaScript: http://www.crockford.com/javascript/inheritance.html
la source
Certainement. Il existe environ mille façons d'implémenter des systèmes de classes / instances en JavaScript. En voici une:
Ce n'est pas vraiment une classe de base abstraite bien sûr. Voulez-vous dire quelque chose comme:
la source
la source
Il n'est pas garanti que cela fonctionne comme
__proto__
n'est pas une variable standard, mais cela fonctionne au moins dans Firefox et Safari.Si vous ne comprenez pas comment cela fonctionne, lisez la chaîne de prototypes.
la source
setPrototypeOf
encore de méthode dont j'aurais besoin pour mon code.Vous pouvez créer des classes abstraites à l'aide de prototypes d'objets, un exemple simple peut être le suivant:
Vous pouvez changer la méthode ci-dessus ou non, c'est à vous de la mettre en œuvre. Pour une observation détaillée, vous pouvez visiter ici .
la source
La question est assez ancienne, mais j'ai créé une solution possible pour créer une "classe" abstraite et bloquer la création d'objets de ce type.
Comme vous pouvez le voir, le dernier objet nous donne une erreur, c'est parce que Animal dans le prototype a une propriété
abstract
. Pour être sûr que c'est Animal, pas quelque chose qui aAnimal.prototype
dans la chaîne de prototypes que je fais:Je vérifie donc que mon objet prototype le plus proche a la
abstract
propriété, seul l'objet créé directement à partir duAnimal
prototype aura cette condition sur true. La fonctionhasOwnProperty
ne vérifie que les propriétés de l'objet actuel et non ses prototypes, ce qui nous donne la certitude à 100% que la propriété est déclarée ici et non dans la chaîne de prototypes.Dans ma proposition, nous n'avons pas à changer
constructor
chaque fois après,Object.create
comme c'est le cas dans la meilleure réponse actuelle de @ Jordão.La solution permet également de créer de nombreuses classes abstraites dans la hiérarchie, il suffit de créer une
abstract
propriété dans le prototype.la source
Une autre chose que vous voudrez peut-être appliquer est de vous assurer que votre classe abstraite n'est pas instanciée. Vous pouvez le faire en définissant une fonction qui agit comme des FLAG définies comme constructeur de classe abstraite. Cela tentera ensuite de construire le FLAG qui appellera son constructeur contenant l'exception à lever. Exemple ci-dessous:
la source
Javascript peut avoir un héritage, consultez l'URL ci-dessous:
http://www.webreference.com/js/column79/
Andrew
la source
Nous pouvons utiliser
Factory
un modèle de conception dans ce cas. Javascript utiliseprototype
pour hériter des membres du parent.Définissez le constructeur de la classe parent.
Et puis créez une classe pour enfants.
Définissez ensuite le constructeur de la classe enfants.
Essaye-le.
Voici le lien Codepen pour l'exemple de codage complet.
la source
la source
Je pense que toutes ces réponses spécialement les deux premières (par certains et par jordão ) répondent clairement à la question avec le concept JS de base prototype conventionnel.
Maintenant que vous voulez que le constructeur de la classe animale se comporte en fonction du paramètre passé à la construction, je pense que c'est très similaire au comportement de base de,
Creational Patterns
par exemple, Factory Pattern .Ici, j'ai fait une petite approche pour que cela fonctionne de cette façon.
la source
Animal
constructeur peut être vu comme un anti-pattern, une superclasse ne devrait pas avoir de connaissances sur les sous-classes. (viole Liskov et le principe Open / Close)la source
Si vous voulez vous assurer que vos classes de base et leurs membres sont strictement abstraits, voici une classe de base qui le fait pour vous:
Le mode strict rend impossible la journalisation de l'appelant dans la méthode throwAbstract, mais l'erreur devrait se produire dans un environnement de débogage qui afficherait la trace de la pile.
la source