En PHP / Java, on peut faire:
class Sub extends Base
{
}
Et automatiquement toutes les méthodes, propriétés, champs, etc. publics / protégés de la classe Super deviennent une partie de la classe Sub qui peut être remplacée si nécessaire.
Quel est l'équivalent de cela en Javascript?
javascript
oop
Cliquez sur Upvote
la source
la source
Réponses:
J'ai changé ma façon de faire maintenant, j'essaie d'éviter d'utiliser les fonctions du constructeur et leurs
prototype
propriétés, mais mon ancienne réponse de 2010 est toujours en bas. Je préfère maintenantObject.create()
.Object.create
est disponible dans tous les navigateurs modernes.Je dois noter que
Object.create
c'est généralement beaucoup plus lent que d'utilisernew
avec un constructeur de fonction.jsfiddle
L'un des grands avantages de l'utilisation d'Object.create est de pouvoir passer un argument defineProperties , ce qui vous donne un contrôle significatif sur la façon dont les propriétés de la classe peuvent être accédées et énumérées, et j'utilise également des fonctions pour créer des instances, celles-ci servent de constructeurs d'une certaine manière, comme vous pouvez le faire à la fin au lieu de simplement renvoyer l'instance.
jsfiddle
Voici ma réponse originale de 2010:
la source
alert()
pour voir quelsinstance.showColor()
retours je reçois encoreundefined
. jsbin.com/uqalin/1En JavaScript, vous n'avez pas de classes, mais vous pouvez obtenir l'héritage et la réutilisation du comportement de plusieurs manières:
Héritage pseudo-classique (par prototypage):
Doit être utilisé avec l'
new
opérateur:Application de fonction ou "chaînage de constructeur":
Cette approche doit également être utilisée avec l'
new
opérateur:La différence avec le premier exemple est que lorsque nous
apply
leSuper
constructeur de l'this
objet à l'intérieurSub
, il ajoute les propriétés assignées àthis
onSuper
, directement sur la nouvelle instance, par exemplesubInstance
contient les propriétésmember1
etmember2
directement (subInstance.hasOwnProperty('member1') == true;
).Dans le premier exemple, ces propriétés sont atteintes via la chaîne de prototypes , elles existent sur un
[[Prototype]]
objet interne .Héritage parasite ou constructeurs de puissance:
Cette approche est basée essentiellement sur "l'augmentation d'objet", vous n'avez pas besoin d'utiliser l'
new
opérateur, et comme vous pouvez le voir, lethis
mot-clé n'est pas impliqué.ECMAScript 5e éd.
Object.create
méthode:La méthode ci-dessus est une technique d'héritage prototypique proposée par Crockford .
Les instances d'objet héritent d'autres instances d'objet, c'est tout.
Cette technique peut être mieux que simple « augmentation de l' objet » , car les propriétés héritées ne sont pas copiées sur toutes les nouvelles instances d'objet, puisque la base de l' objet est défini comme
[[Prototype]]
de l' étendue objet, dans l'exemple ci - dessussubInstance
contient physiquement que lamember3
propriété.la source
Object.create()
ou uneclone()
fonction personnalisée (par exemple mercurial.intuxication.org/hg/js-hacks/raw-file/tip/clone.js ) pour hériter directement de l'objet prototype; voir les commentaires sur stackoverflow.com/questions/1404559/… pour une explicationObject.create
méthode :)member1
variable, ce qui n'est pas du tout souhaitable. Bien sûr, ils peuvent le réécrire, mais cela n'a tout simplement aucun sens. github.com/dotnetwise/Javascript-FastClass est une meilleure solution de sucre.Sub.prototype = new Super();
. Et si les deux classes ne seront jamais utilisées pendant l'exécution du script? Cela ressemble à un problème de performances. Pourquoi dois-je créer une classe parent si la classe enfant n'est pas réellement utilisée? Pouvez-vous préciser s'il vous plaît? Voici la simple démonstration du problème: jsfiddle.net/slavafomin/ZeVL2 Merci!Pour ceux qui atteignent cette page en 2019 ou après
Avec la dernière version du standard ECMAScript (ES6) , vous pouvez utiliser le mot-clé
class
.Notez que la définition de classe n'est pas une définition régulière
object
; il n'y a donc pas de virgule entre les membres de la classe. Pour créer une instance d'une classe, vous devez utiliser lenew
mot - clé. Pour hériter d'une classe de base, utilisezextends
:Pour hériter d'une classe de base, utilisez
extends
:À partir de la classe dérivée, vous pouvez utiliser super de n'importe quel constructeur ou méthode pour accéder à sa classe de base:
super().
super.getName()
,.Il y a plus à utiliser des classes. Si vous souhaitez approfondir le sujet, je vous recommande « Classes in ECMAScript 6 » du Dr Axel Rauschmayer. *
la source
la source
class
etextends
c'est du sucre de syntaxe (ultra utile) pour la chaîne prototype: stackoverflow.com/a/23877420/895245Eh bien, en JavaScript, il n'y a pas "d'héritage de classe", il n'y a que "héritage de prototype". Donc, vous ne créez pas une classe «camion» pour ensuite la marquer comme une sous-classe de «automobile». Au lieu de cela, vous créez un objet "Jack" et dites qu'il utilise "John" comme prototype. Si John sait combien "4 + 4" est, alors Jack le sait aussi.
Je vous suggère de lire l'article de Douglas Crockford sur l'héritage prototypique ici: http://javascript.crockford.com/prototypal.html Il montre également comment vous pouvez faire en sorte que JavaScript ait un héritage "similaire" comme dans d'autres langages OO et explique ensuite que signifie en fait casser javaScript d'une manière qu'il n'était pas censé être utilisé.
la source
Je trouve cette citation la plus éclairante:
J'aime utiliser des constructeurs plutôt que des objets, donc je suis partisan de la méthode "d'héritage pseudo-classique" décrite ici par CMS . Voici un exemple d' héritage multiple avec une chaîne prototype :
Voici une autre bonne ressource de MDN , et voici un jsfiddle pour que vous puissiez l'essayer .
la source
L'héritage Javascript est un peu différent de Java et PHP, car il n'a pas vraiment de classes. Au lieu de cela, il a des objets prototypes qui fournissent des méthodes et des variables membres. Vous pouvez chaîner ces prototypes pour fournir l'héritage d'objet. Le modèle le plus courant que j'ai trouvé lors de la recherche de cette question est décrit sur le Mozilla Developer Network . J'ai mis à jour leur exemple pour inclure un appel à une méthode de superclasse et pour afficher le journal dans un message d'alerte:
Personnellement, je trouve l'héritage en Javascript gênant, mais c'est la meilleure version que j'ai trouvée.
la source
vous ne pouvez pas (au sens classique du terme). Javascript est un langage prototypique. Vous remarquerez que vous ne déclarez jamais une "classe" en Javascript; vous définissez simplement l'état et les méthodes d'un objet. Pour produire l'héritage, vous prenez un objet et vous le prototypez. Le prototype est étendu avec de nouvelles fonctionnalités.
la source
Vous pouvez utiliser
.inheritWith
et.fastClass
bibliothèque . Il est plus rapide que la plupart des bibliothèques populaires et parfois même plus rapide que la version native.Utilisation très simple:
Usage
la source
la source
Après avoir lu de nombreux articles, j'ai trouvé cette solution ( jsfiddle ici ). La plupart du temps, je n'ai pas besoin de quelque chose de plus sophistiqué
la source
Grâce à la réponse de CMS et après avoir tripoté pendant un certain temps prototype et Object.create et que sais-je encore, j'ai pu trouver une solution soignée pour mon héritage en utilisant apply comme indiqué ici:
la source
Depuis ES2015, c'est exactement comme ça que vous faites l'héritage en JavaScript
la source
la source
Classes ES6:
Javascript n'a pas de classes. Les classes en javascript ne sont que du sucre syntaxique qui s'ajoute au modèle d' héritage prototypique que javascript. Vous pouvez utiliser le JS
class
pour appliquer l'héritage prototypique, mais il est important de réaliser que vous utilisez encore des fonctions de constructeur sous le capot.Ces concepts s'appliquent également lorsque vous étendez une
es6
«classe» à l'aide du mot clé extend. Cela crée simplement un lien supplémentaire dans la chaîne de prototypes. le__proto__
Exemple:
Object.create ()
Object.create()
est également un moyen de créer un héritage dans JS en javascript.Object.create()
est une fonction qui crée un nouvel objet, et prend un objet existant comme argument. Il attribuera l'objet qui a été reçu comme argument au__proto__
propriété de l'objet nouvellement créé. Encore une fois, il est important de réaliser que nous sommes liés au paradigme d'héritage prototypique que JS incarne.Exemple:
la source
Vous ne pouvez pas hériter d'une classe en JavaScript, car il n'y a pas de classes en JavaScript.
la source