JavaScript remplacer les méthodes
Disons que vous avez le code ci-dessous:
function A() {
function modify(){
x = 300;
y = 400;
}
var c = new C();
}
function B() {
function modify(){
x = 3000;
y = 4000;
}
var c = new C();
}
C = function () {
var x = 10;
var y = 20;
function modify() {
x = 30;
y = 40;
};
modify();
alert("The sum is: " + (x+y));
}
Maintenant la question est de savoir si il y a une voie dans laquelle je peux remplacer la méthode modify
de C avec les méthodes qui sont dans A et B. En Java, vous utilisez le mot-clé super, mais comment pouvez-vous obtenir quelque chose comme ceci en JavaScript?
modify
n'est pas une méthode mais une fonction imbriquée - il une différence entre ces deux...- En Java que vous utilisez le
super
mot clé pour accéder à la non-champs privés et les méthodes de la super-classe. Vous ne l'utilisez pas pour les remplacer.
Vous devez vous connecter pour publier un commentaire.
Edit: Il est désormais de six ans, depuis la première réponse a été écrite et beaucoup de choses ont changé!
Bonne chance!
JavaScript héritage semble un peu différent de Java. Voici comment le JavaScript natif de l'objet système recherche:
Malheureusement, c'est un peu moche et il n'a pas une très belle façon de "super": vous devez spécifier manuellement les parents des classes de la méthode que vous souhaitez appeler. En conséquence, il existe une variété de outils pour faire de la création de classes plus agréable. Essayez de regarder Prototype.js, Backbone.js ou un autre bibliothèque qui comprend une belle syntaxe pour faire de la programmation orientée objet en js.
Puisque c'est un top hit sur Google, j'aimerais donner une mise à jour de réponse.
À l'aide de ES6 classes fait de l'héritage et redéfinition de méthode beaucoup plus simple:
La
super
mot clé se réfère à la classe parent lorsque utilisé dans la classe qui hérite. Aussi, toutes les méthodes de la classe parent sont liés à l'instance de l'enfant, de sorte que vous n'avez pas à écriresuper.method.apply(this);
.Comme pour la compatibilité: l'ES6 tableau de compatibilité affiche uniquement les versions les plus récentes des acteurs majeurs de la prise en charge de classes (pour la plupart). V8 navigateurs en ont eu depuis le mois de janvier de cette année (Chrome et Opera), et Firefox, en utilisant le SpiderMonkey JS moteur, voir les classes le mois prochain avec leur Firefox 45 communiqué. Sur le côté mobile, Android n'est toujours pas en charge cette fonctionnalité, tandis que iOS 9, la libération il y a cinq mois, a une prise en charge partielle.
Heureusement, il y a Babel, une bibliothèque JS pour re-compilation de l'Harmonie code dans ES5 code. Les Classes, et beaucoup d'autres fonctionnalités utiles dans ES6 votre code Javascript beaucoup plus lisible et maintenable.
Une fois devrait éviter l'émulation classique OO et l'utilisation prototypique OO au lieu. Une belle bibliothèque utilitaire pour le prototype de l'OO est traits.
Plutôt que d'écraser les méthodes et mise en place de l'héritage des chaînes (il faut toujours privilégier une composition d'objet sur l'objet de l'héritage de), vous devez être le regroupement des fonctions réutilisables dans les traits et la création d'objets avec ceux-ci.
Live Exemple
modifier() dans votre exemple est une fonction privée, qui ne sera pas accessible à partir de n'importe où, mais à l'intérieur de votre A, B ou C de la définition. Vous devez le déclarer comme
C n'a pas de référence à ses parents, à moins que vous passez à C. Si C est mis en place pour hériter de A ou de B, il héritera de ses méthodes publiques (et pas de ses fonctions privées comme vous devez le modifier() définie). Une fois que C hérite des méthodes de son parent, vous pouvez remplacer les méthodes héritées.
la méthode
modify()
que vous avez appelé dans la dernière est appelée dans un contexte globalsi vous souhaitez remplacer
modify()
vous devez d'abord hériterA
ouB
.Peut-être que vous essayez de faire ceci:
Dans ce cas
C
hériteA
C.prototype.modify()
aurait le mauvaisthis
valeur. À savoirC.prototype
au lieu de l'instance de c. Veuillez utiliser.call(this)
mais alors, votre réponse est juste un doublon 🙂Pas, sauf si vous faites toutes les variables "public", c'est à dire en faire des membres de la
Function
soit directement ou par l'intermédiaire de laprototype
propriété.Vous remarquerez quelques changements.
Plus important encore, l'appel à la soi-disant "super-classes" constructeur est maintenant implicite dans cette ligne:
Les deux
A
etB
auront désormais individuellement modifiables membresx
ety
qui ne serait pas le cas si nous avions écrit... = C
à la place.Puis,
x
,y
etmodify
sont "tout public" membres ainsi que l'attribution d'un autreFunction
à euxva "remplacer" l'original
Function
de ce nom.Enfin, l'appel à
modify
ne peut pas être fait dans leFunction
déclaration parce que l'appel implicite à la "super-classe" devait être exécutée de nouveau lorsque nous avons mis sur la soi-disant "super-classe" à laprototype
propriété de la soi-disant "sous-classes".Mais bon, c'est plus ou moins comment vous pourriez faire ce genre de chose en JavaScript.
HTH,
FK
<name>.prototype = new C;
votre répétition tous les membres du prototype de toute façonObjects
serait partage le même membre dansC
si vous n'avez pas instancier unC
Objet. Ainsi, en changeantx
dansA
allait changerx
dansC
et donc changerx
dansB
. Ce qui est évidemment undesireable.A
etB
d'hériter deC
. Si cette ligne serait manquant, ce ne serait pas le cas. En fait, le seul prototype à la foisA
ainsi queB
serait "l'ombre" d'avoir accès à, dans ce cas, seraitObject.prototype
.x
,y
etmodify
et donc de l'ombre tousC
's membres. Quel est le point de mettre de C dans le prototype si vous n'êtes pas à l'utiliser? C'est du code mort.C
auraient membres hérités parA
etB
. Sinon, ce ne serait pas un problème concernant l'héritage de toute façon.JS: